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 有很大的学问
这里面 介绍了关于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。