当我们使用Service服务是,需要继承Service并重写下面的方法:
1、onCreate():每次服务创建的时候调用, 在任何Context中调用startService()时,如果该服务还没创建,就会先调用onCreate(),再去调用onStartCommand(), 如果已经创建,则不会再调用onCreate(),直接调用onStartCommand();
2、onStartCommand():非onStart(),每次启动服务的时候调用,同一个服务可以重复的启动,只要在任何一个Context中调用startService(),都会调用onStartCommand;
3、onDestroy():在服务销毁的时候调用,下面会分析什么时候才会销毁服务;
4、onBind():在服务没有绑定过任何ServiceConnection时才会调用,主要是返回服务的IBinder下转类对象给活动,实现活动控制服务;
对服务的控制,有下面的方法:
1、startService():启动服务,有可能会触发服务的onCreate(),但肯定会触发onStartCommand();
注意:不管在多个Context中多次调用startService()来启动同一个服务,也只会存在一个服务实例,只是多次的触发服务的onStartCommand()方法,只需在任何一个Context中调用一次stopService()或stopSelf()就能把该服务停下来;也就是说,如果一个服务已经销毁了,再次启动服务的时候,将会是一个新的服务,如果服务还没有销毁,还在运行或者只是停止了,再次启动服务,还是原来的服务
2、stopService():停止服务,有可能会触发onDestroy();
3、bindService():绑定服务,主要是为了让活动与服务之间可以沟通而搭建一条桥梁,通过ServiceConnection把活动中的IBinder下转类(子类)对象指向服务中的IBinder下转类实例,这个IBinder下转类就是服务实际要做的内容,有可能会触发onBind(),上面说到服务的IBinder下转类就是首次绑定时调用onBind()返回的;
4、unbindService():解除绑定,有可能会触发onDestroy(),注意,在如果某个ServiceConnection没有bindService()去绑定的前就去unbindService()它,则会报错;
上面说到stopService()与unbindService()有可能会触发onDestroy(),要触发就必须满足:服务停止,没有ServiceConnection绑定:
1、没有ServiceConnection把Context与服务绑定时,停止服务,就会触发onDestroy(),如果有绑定,则需要把所有ServiceConnection都解绑定后,停止服务才能触发onDestroy(),如果ServiceConnection所绑定的context销毁了,那么该ServiceConnection也相当于是解除绑定了;
2、当服务没有开启,只是绑定了ServiceConnection,只要把所有ServiceConnection都解除绑定后,就会触发onDestroy(),如果服务开启了,则还需要把服务停止了才能onDestroy();
另外还有一个需要注意的地方:当一个活动与服务用ServiceConnection绑定后,并在活动中用字段把IBinder下转类对象保存下来,即便后面ServiceConnection被解绑了,而且服务被销毁了,这个字段有可能还能使用,还能操作这个“销毁了”的活动,因为这个活动虽然是调用了onDestroy()方法,但是还没有被内存回收机制真正的回收掉;