Service生命周期:
单纯startService:onCreate onstart ondestroy。每次调用startService就调用一次onstart。调用stopService或stopSelf会回调ondestroy,service将被撤销。
单纯调用bindService:onCreate onBind onUnbind onDestroy。所有绑定者都调用unbindService后就会调用unbind,接着是onDestroy。在所有调用者(组件,如activity)退出后,会自动调用unbind和onDestroy。
先调用startService再调用bindService,回调情况是,调用onCreate onstart onbind。在所有绑定者退出时或解绑后,并不会撤销service,需要调用stopService或者stopSelf。只是调用stopService也无法撤销service,需解绑所有绑定者。
先bindService再startService,回调顺序是onCreate onBind onStart,所有绑定者解绑后,service被撤销。调用onUnbind和onDestroy。要撤销,除了解绑所有绑定外,还要调用stopService,顺序可以调乱。所以当所有绑定的组件退出后,service仍然在跑。
bindService需传入三个参数分别是intent,ServiceConnection,int flag。ServiceConnection中有两个方法分别会在bind和unbind的时候调用
Service和BroadcastReceiver的生命周期的区别:
service和broadcastReceiver都是运行在主线程的,所以在onstart或者onReceive方法中执行耗时任务时,要开一个子线程,但receiver开子线程,在子线程执行过程中,onReceive很可能已经执行完,此时进程中可能没有活跃组件了(broadcastReceiver只有在执行onReceiver方法时才被系统认为是活跃的),此时为了让子线程执行完,就要不让进程被kill,就要一个活跃组件,就要启动一个service,因为service在没有调用stop前都是活跃的。
Service的后台概率:
thread是cpu调度的基本单位。用于异步执行。由应用进程托管
service是运行在主线程如果是本地服务。如是remote service则在单独进程运行。一个服务只有一个实例,由系统进程托管。
这个实例是全局的,可由各个activity操作。绑定回调bind方法,解绑回调unbind方法。调用实例的startService方法,回调onStart方法。
所有activity解绑后,可能会不允许访问这个实例了。
所以跟子线程半毛关系都没有。就是一个特殊一点的类,跟系统机制有关。后台只是一个概念。
AIDL和Service:
aidl,用于远程service,允许其他应用程序调用和绑定这个服务。本地sevice,只允许本应用调用和绑定。需加一个aidl文件,用idl语言写的。在manifest文件中,注册service时,需加入一个属性proccess:remote。启动远程服务的id必须是gen下的根据aidl文件自动生成的java文件。在服务端(即有aidl文件的那个应用)不用声明remote,在客户端要在manifest的service标签中声明remote。
如果要从服务端返回一个对象,必须要在客户端那里有这个类就要用aidl实现。这个对象要在客户端建立一个.aidl文件,把服务端那边的拷贝过来(包括aidl和对象的java文件)。
主要是那个binder,可以传送对象。