Service

来源:互联网 发布:python绝技 pdf 中文 编辑:程序博客网 时间:2024/05/19 07:10

声明:此文非本人原创,为整理网络资料加自己的一些注解所得。

1.Service的启动一般都是 某个组件调用startService 或者 bindService  
2. 通过Android特有的 Binder IPC机制 通知 ActivityServiceManager ,
3.Ams就会直接通过Binder IPC机制 通知 Service 所在的ActivityThread 把这个服务启动起来 (把这个Service的class文件load到内存)
4.如果是BindService ,Ams还会从Service哪里取到一个binder 然后同样通过IPC传给启动他的Activity ,Activity 拿到这个5.binder后就可以和Service通讯了耗时任务同样是需要在异步线程中完成的!

一.通过startService方式启动的Service

1.context.startService() 的生命周期
context.startService()  -> onCreate()  -> onStartCommand()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop 
如果Service还没有运行,则android先调用onCreate(),然后调用onStartCommand();
如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能会重复调用多次。 
如果stopService的时候会直接onDestroy,如果是调用者自己直接退出而没有调用stopService或者Service.stopSelfResult()的话,Service会一直在后台运行,该Service的调用者再启动起来后可以通过stopService或者Service.stopSelfResult()关闭Service。
所以调用startService的生命周期为:

onCreate-->onStart(可多次调用) -->onDestroy

2.context.bindService()启动的Service的生命周期(绑定

context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop

       onBind()将返回给客户端一个IBinder接口实例,IBinder允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

public boolean bindService(Intent service, ServiceConnection conn,        int flags) {    return mBase.bindService(service, conn, flags);}
实例化ServiceConnection接口的实现类,重写onServiceConnected()     系统调用这个来传送在serviceonBind()中返回的IBinder;

和onServiceDisconnected()方法      service的连接意外丢失时调用(service崩溃了或被强杀了)

     在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
特别注意:
1、在调用 bindService 绑定到Service的时候,就应当保证在某处调用 unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自动解除,并且Service会自动停止);
2、使用 startService 启动服务之后,一定要使用 stopService停止服务,不管你是否使用bindService;
3、同时使用 startService 与 bindService 要注意到,Service 的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;
4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。
5、应当使用 onStartCommand 而不是 onStart。
     长按home调出最近运行历史,在这里面清除软件。这时候Service调用了onTaskRemoved函数。在一般情况下 没调用onTaskRemoved函数的话 Service是正常的在后台运行的,如果调用了,服务可能会处于正在重启的状态,


0 0
原创粉丝点击