最近突然想测试一下android service的生命周期,于是就自己写了一个demo感受了一下,确实挺奇妙的。
service有两种启动方式,bindservice和startservice,单独使用的话,生命周期很明显:
第一种:bindservice(),三个参数,第一个intent,第二个是一个interface -> serviceconnection,第三个参数是bind的类型,有这么几种:
BIND_AUTO_CREATE //表示收到绑定请求的时候,如果服务尚未创建,则即刻创建,在系统内存不足需要先摧毁优先级组件来释放内存,且只有驻留该服务的进程成为被摧毁对象时,服务才被摧毁 BIND_DEBUG_UNBIND //通常用于调试场景中判断绑定的服务是否正确,但容易引起内存泄漏,因此非调试目的的时候不建议使用 BIND_NOT_FOREGROUND //表示系统将阻止驻留该服务的进程具有前台优先级,仅在后台运行,该标志位位于Froyo中引入。 BIND_ABOVE_CLIENT和BIND_IMPORTANT //当你的客户端在前台,这个标示符下的Service也变得重要性相当于前台的Activity优先级迅速提升。若是BIND_ABOVE_CLIENT,则优先级已经超过了Activity,也就是说Activity要比Service先死,当资源不够的时候。
BIND_ALLOW_OOM_MANAGEMENT
通过bindservice启动一个service的生命周期是onCreate-->onBind-->(onServiceConnection)->onDestory
第二种:startService() 就一个参数,一个intent,生命周期:
onCreate-->onStartCommand->onDestory
如果bind一个service之后调用stopService会怎么样呢?
答案是没用
也就是说不会掉用onDestory,当然了这都是通过context里面的方法调用的,在service里面去调用stopSelf()也是不可以把当前Service停掉的,只能通过unbindservice来停止。
如果start一个service之后是可以再bind这个service,并且bind这个service之后是不可以调用stopService停止的。bind的时候只会调用onBind生命周期。
在测试过程中会发现一个startId的东西,这个东西是干什么用的呢?
这个startId是记录service start的次数,也算是一个标记吧,当调用stopSelf(int startId)的时候,可以传一个startId来停止服务。这样只有在达到预定的start次数才会停止。
今天就先记录到这里吧,有空再去测试其他的东西。