1、有关Service的startService与bindService在各种情形下生命周期的变化
参考:http://blog.csdn.net/qq_22804827/article/details/78609636
需要注意的是,startService
、stopService
、bindService
、unbindService
方法都是Context的成员方法。
Android Developers文章参考:
https://developer.android.com/guide/components/bound-services.html?hl=zh-cn
2、有关onCreate()、onStart()、onBind()等生命周期方法所在的线程
以前面的情景为基础,如果在两个Activity分别开启一个子线程,在其中去startService和bindService,此时,就算是在子线程中执行这两个方法,但是有关Service的生命周期方法都还是会在主线程中执行。
简单的说明原因,就是Service的生命周期方法的调用都有借助到ActivityThread中的H(本质上是一个Handler),通过H的相关方法来实现的,而ActivityThread则是UI线程,即主线程。
具体原因可参见《Android艺术探索》的“Service的工作过程“章节。
3、startCommand()方法返回值
(1)START_STICKY = 1
,当Service已经启动后,如果startCommand方法返回值是这个,则表示如果内存不足Service被系统杀掉,系统会在后续内存空闲时尝试着重新创建这个Service,但是不会再传递上次启动Service时的Intent,onStartCommand中的Intent参数会为null。
(2)START_NOT_STICKY = 2
,系统把Service杀掉后,不会尝试重新创建这个Service。
(3)START_REDELIVER_INTENT = 3
,系统把Service杀掉后,会尝试重新创建这个Service,并且会把之前启动Service的最后一个Intent重新传递回来。
4、有关bindService()方法的第三个参数
第三个参数是一个指示绑定选项的标志。
由于本人暂时能力有限,无法完全正确理解某些标志值的具体含义,翻阅一些博客说得也是一知半解,有兴趣的可以自行去看谷歌官方的文档,避免我在此误导大家。
https://developer.android.com/reference/android/content/Context.html#BIND_AUTO_CREATE
Service的行为和运行模式,其中BIND_AUTO_CREATE和BIND_WAIVE_PRIORITY两个flag在Ice Cream Sandwich也就是Android4.0版本前后有一些区别,主要是:
在4.0之前,Service的优先级被默认视同后台任务,如果设置了BIND_AUTO_CREATE则Service的优先级将等同于宿主进程,也就是调用bindService的进程。
在4.0及以上就完全变了,Service的优先级默认等同于宿主进程,只有设置了BIND_WAIVE_PRIORITY才会使Service的被当做后台任务对待,WAIVE就是放弃的意思嘛。
基于上述区别,必须对不针对4.0以上开发的的App进行兼容。这种App跑在4.0以上时,bindService的时候没有同时设置BIND_AUTO_CREATE则Service应被视为后台任务,那么BIND_WAIVE_PRIORITY会被偷偷加上去。
来自:http://blog.csdn.net/pan11115111/article/details/70236354
补充内容:
如果设置Service于一个单独的进程(具体的设置方法为在AndroidManifest文件中为<service/>
标签添加android:process
属性即可),则其生命周期方法会运行于新建的进程。
具体原因需要参考Binder机制了。