android开发-Service的生命周期

来源:互联网 发布:美国10月非农数据预测 编辑:程序博客网 时间:2024/06/11 05:15

1、启动Service的方式有两种

startService以及bindService

他们各自的生命周期为

startService:onCreate->onCommend  如果多次调用startService方法 那么会多次执行onCommend方法

bindService: onCreate ->onBind  如果其他的Activity也绑定了服务那么 不会调用onBind回调 。

如果activity关闭了连接   是不会调用onUnbind的,除非是 最后一个连接的 也断开了 才会触发onBind  然后执行onDestory 

2、混合启动

如果调用了startService方法之后又调用了bindService方法 那么它的执行生命周期是

onCreate->onCommend->onBind

如果先执行了bindService而后执行startService

onCreate->onBind->onCommend

3、关闭服务

如果是混合启动,那么必须都执行unbindService和stopService 而且最后执行的方法 执行完 才会调用onDestory方法


4、bindService方法  回调的Connection方法中onServiceDisconnected,是在意外断开的情况下 会回调,正常关闭的情况下不会调用

所以我们通过这个属性 可以做保活用 用来监听 你的进程是否被kill掉了

5、public int onStartCommand(Intent intent, int flags, int startId) 中的flags 有很大的学问

让后台保活的Service

这里面 介绍了关于flags的用处以及特点

1、START_STICKY


在运行onStartCommand后service进程被kill后,那将保留在开始状态,但是不保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建     service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那将获取到null的intent。
2、START_NOT_STICKY


在运行onStartCommand后service进程被kill后,并且没有新的intent传递给它。Service将移出开始状态,并且直到新的明显的方法(startService)调用才重新创建。因为如果没有传递任何未决定的intent那么service是不会启动,也就是期间onstartCommand不会接收到任何null的intent。
3、START_REDELIVER_INTENT


在运行onStartCommand后service进程被kill后,系统将会再次启动service,并传入最后一个intent给onstartCommand。直到调用stopSelf(int)才停止传递intent。如果在被kill后还有未处理好的intent,那被kill后服务还是会自动启动。因此onstartCommand不会接收到任何null的intent。


源码地址

原创粉丝点击