两种启动方式
- startService()启动方式:主要用于执行后台计算
- bindService()启动方式:主要用于和其它组件的交互
说明:这两种状态是可以共存的,即一个Service既可以处于启动状态,也可以同时处于绑定状态。
1、启动方式
1、生命周期
2、流程
- 第一次调用startService()方法后,首先调用onCreate()和onStartCommand()方法,此时Service进入运行状态;如果这个时候再次调用startService()方法,就不会再创建新的Service对象,而是直接复用已经存在的Service,可以理解为Service是单实例模式,只能在系统中存在一个实例。
- 由于启动方式打开的Service和调用者没必然联系,所以调用者destroy之后,Service还是会继续运行的。
- Service并不是运行在一个独立的进程中的,而是依赖于创建服务时所在的应用程序进程,当某个应用程序进程被杀死的时候,依赖于该应用程序进程的Service也会被杀掉。
- 无论启动了多少次Service,只需调用一次StopService即可停掉Service
3、总结一下:
1.onCreate():该方法在整个生命周期中只会在创建Service时调用一次!
2.onDestory():该方法只会当Service被关闭时会回调一次!
3.onStartCommand(intent,flag,startId):当客户端调用startService(Intent)方法时会回调,可多次调用StartService方法, 但不会再创建新的Service对象,而是继续复用前面产生的Service对象,但会继续回调 onStartCommand()方法!
4、验证一下:
public class MyService extends Service {
public static final String TAG = "MyService";
public MyService1() {
}
@Override
public void onCreate() {
Log.d(TAG, "onCreate: ");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: ");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy: ");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
效果:
2、绑定方式
1、生命周期
2、流程
- 首先系统会在调用bindService之后实例化一个Service并绑定,然后紧接着调用onCreate和onBind()方法。
- 然后调用者就可以通过IBinder和Service进行交互了,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!
- 调用unbindService(),此时若只有一个客户端绑定了此服务,那么onUnbind和onDestory方法将会被调用!若是多个客户端绑定同一个Service的话,情况如下 当一个客户完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。
- 绑定模式下的Service和调用者共存亡