- 2016年12月8日,Google中国开发者大会在京举行,同时正式上线了Google中国开发者网站Google Developers,查看官方学习资源再也不用爬梯子了
- 简介
- 使用说明
- 启动与绑定
简介
很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。为了处理这种后台进程,Android引入了Service的概念。
- Service在Android中是一种长生命周期的组件,它不实现任何用户界面,是一个没有界面的组件,由其他组件开启。
- Service长期在后台运行, 执行不关乎界面的一些操作比如: 网易新闻服务,每隔1分钟去服务查看是否有最新新闻。
- Service和Thread有点相似,但是使用Thread不安全, 不严谨。
- Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的操作。
使用说明
- 创建Service,定义类继承Service,AndroidManifest.xml中定义<service>
- 开启Service,在其他组件中调用startService方法
startService(intent);(在activity中可以直接调用),会执行onstartCommand(生命周期方法)(onStart()以过期的方法),如果发现service还没有,就会先创建执行oncreate。
onCreate只会执行一次,服务一旦被创建出来,就不会再执行onCreate方法,以后再去开启服务只会执行onStartCommand。
停止Service,调用stopService方法,会执行onDestory()(生命周期方法)。 - 服务也是运行在主线程中,耗时操作需要放到子线程中,不然会出现anr
- setForegound(true)(直接在service里调用),为了避免服务被杀死,我们可以指定这个服务为前台进程。
服务在执行生命周期方法时,也是一个前台进程。广播接收者也一样,在执行生命周期方法onReceive时,也是一个前台进程。
启动与绑定
- startService(),标准开启模式。
- bindService(),绑定模式。
标准开启模式:
被开启的service通过其他组件调用 startService()被创建。这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。
绑定模式:
被绑定的service是当其他组件(一个客户)调用bindService()来创建的。客户可以通过一个IBinder接口和service进行通信。客户可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
Service的这两种生命周期并不是完全分开的。也就是说,你可以和一个已经调用了 startService()而被开启的service进行绑定。
比如,一个后台音乐service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。
绑定服务方法:bindService(intent,serviceConnection,int flag);在其他组件中调用此方法,调用后服务内部的生命周期方法onBind方法执行,一旦绑定成功,onBind只执行一次,再次绑定,onBind不会执行。
serviceConnection:连接对象,连接上服务之后可以调用服务的方法传入一个自定义的ServiceConnection用来接收IBinder。实例化ServiceConnection对象,重写内部方法onServiceConnected(ComponentName name,IBinder Binder):绑定成功获取连接时,执行的方法。
unBindService()解除绑定服务,内部调用服务的生命周期方法onUnbind(),然后调用onDestory()销毁服务。服务只能被解除绑定一次,如果unBindService方法被调用多次,就会出错。
public class TestService extends Service {
int mStartMode;
IBinder mBinder;
boolean mAllowRebind;
@Override
public void onCreate() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
@Override
public IBinder onBind(Intent intent) {
bindService()
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
@Override
public void onRebind(Intent intent) {
bindService(),
}
@Override
public void onDestroy() {
destroyed
}
}
Service生命周期