Service分为Local Service和Remote Service。Local service只允许统一进程内的应用程序进行访问,而远程服务可以通过AIDL技术支持跨进程访问。
服务可以通过 startService(intent)和bindService(intent,serviceconnection,int)启动
startService()通过stopService结束服务,优点是调用简单,方便控制,缺点是启动Service之后除了再次调用或结束服务外就无法对服务内部状态进行操控。
bindService()通过unbindService()结束,优点是运用灵活,可以通过IBinder接口获取Service的句柄进行状态检测。
常见方法
void onCreate() | 当Service启动时触发,整个生命周期只会触发一次 |
int onStartCommand(intent, flags, startId) | 只在startService启动服务时触发,返回值决定服务结束后的处理方式 |
IBinder onBind(intent) | 只在bindService时触发,返回一个IBinder对象进行远程操控 |
void onRebind(intent) | startService->bindService->onUnbind(return true)->bindService时调用 |
boolean onUnbind(intent) | unbindService触发此方法,默认为false, 当返回true,下次bindService时会调用onReBind |
void onDestroy() | 1/startService->stopServicee 2/bindService->unbindService 3/startService->bindService->unbindService->stopService |
实现方法
startService比较简单,在activity中new一个Intent,讲activity与自定义的service类名传入startservice中,在自定义的实现service接口的类中重写onCreate,onStartCommand,onDestroy方法。最后需要在AndoridManifest中绑定service。
bindService较复杂,需要用到自定义的实现了serviceconnection接口的类,在这个类里面需要重写两个方法 onServiceConnected和onServiceDisconnected.在系统bindService完成以后,会调用onServiceConnected,用户可以在里面通过IBinder获取service的句柄,可以使用binder来处理service。
public class MyService extends service{
private mybinder mybinder;
public class mybinder extends binder{public myservice getservice(){return myservice.this;}}
public IBinder onBind(intent){return this.mybinder;}
}
public class MyServiceConnection implements ServiceConnection{
onServiceConnected(...,IBinder service){ MyService myservice = ((Myservice.mybinder)binder).getService();}
}
startService与bindService共存时,这时候 Service 的onBind()方法和onUnbind()方法只在第一个bindService流程中触发,其后多次调用bindService(),此事件都不会被触发,而只会触发onServiceConnected()事件。这是因为在默认情况下,系统在绑定时会先搜索IBinder接口,如果Service已经绑定了Binder对象,系统就会直接跳过onBind()方法。解决方案是使用onReBind。