如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行。Service跟 Activity一样也由Intent调用。在工程里想要添加一个Service,先新建继承Service的类,然后到 AndroidManifest.xml -> Application ->Application Nodes中的Service标签中添加。
Service要由Activity通过startService 或者 bindService来启动,Intent负责传递参数。
startService与bindService都可以启动Service,那么它们之间有什么区别呢?它们两者的区别就是使Service的周期改变。由 startService启动的Service必须要有stopService来结束Service,不调用stopService则会造成 Activity结束了而Service还运行着。bindService启动的Service可以由unbindService来结束,也可以在 Activity结束之后(onDestroy)自动结束。
Service的生命周期
Service有startService()和bindService()两种启动Service方法,每种方法Service的生命周期是不一样的。
1 通过startService()
Service会经历 onCreate --> onStartCommand() 注: onStartCommand()方法可代替onStart()方法,但测试得两个方法都调用了顺序为 onCreate()-->onStartCommand()-->onStart()-->onDestroy()
stopService的时候直接onDestroy
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。
如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次 创建服务,
但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结 束服务
2 通过bindService()
Service只会运行onCreate()-->onBind()
这个时候 调用者和Service绑定在一起
unbindService的时候 onUnbind()-->onDestroyed()
调用者退出了,Srevice就会调用onUnbind()-->onDestroyed()
所谓绑定在一起就共存亡了。
如果调用bindService()方法前服务已经被绑定,
多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。
注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。
在Activity中得到绑定的Service对象:
在Service类中:
public class MyBinder extends Binder{
public MyService getService(){
return MyService.this;
}
}
public IBinder onBind(Intent intent) {
return new MyBinder();
}
在Activity中 :
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyService service = ((MyService.MyBinder) iBinder).getService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};