Service的启动、绑定,以及生命周期的笔记

来源:互联网 发布:linux杀进程命令 编辑:程序博客网 时间:2024/06/16 00:34

1、有关Service的startService与bindService在各种情形下生命周期的变化

参考:http://blog.csdn.net/qq_22804827/article/details/78609636

需要注意的是,startServicestopServicebindServiceunbindService方法都是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机制了。

阅读全文
0 0