清晰理解service

service的start和bind有什么区别?

start启动的service,service有独立的生命周期,不依赖该组件,多次调用startService,只会调用一次onCreate方法,但会多次调用onStartCommand方法。start启动的service,必须通过stopService(或者stopSelf)来停止服务。IntentService会自动调用stopSelf来停止服务.
bind启动的service,service依赖该组件,多次调用bindService,只会调用一次onBind方法。当组件销毁后,service也会随之销毁。

同一个service,先startService,然后bindService,如何把它停止掉?

不论startService调用几次,只要调用一次stopServie(或者stopSelf)就可以停止掉
bindService是区分connection对象的,绑定同一个connection对象,不管bind几次,只需要调用一次unbind,如果调用第二次就会发生运行时异常,service not registered。如果绑定的是不同的connection对象,调用n次bind,就需要调用n次unbind。
最后一次调用stopService或者unbind会导致service的onDestroy被调用。

你有注意到Service的onStartCommand方法的返回值么?不同的返回值有什么区别?

一共有以下四种返回值:

/*
*为了兼容版本(start_sticky),在service被杀死之后,并不保证onstartcommand会被再次调用
*/
public static int  START_STICKY_COMPATIBILITY = 0;
/*
*如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新
*创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。
*如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
*/
public static int  START_STICKY = 1;
/**
*非粘性的,使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启
*该服务。
*/
public static int  START_NOT_STICKY  = 2;
/*
*重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该
*服务,除非服务调用了stopSelf,并将被杀死前的Intent的值传入。
*/
public static int  START_REDELIVER_INTENT = 3;

Service的生命周期onCreate, onStartCommand,onBind运行在哪个线程?

生命周期都运行在主线程,所以在service中不能进行耗时操作,容易产生anr。如果想做耗时操作的话,必须另起线程,或者使用IntentService。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【Android Service】 Service 简介(★★★) 很多情况下,一些与用户很少需要产生交互的应用程...
    Rtia阅读 8,307评论 1 21
  • 转载注明出处:http://www.jianshu.com/p/a1d3d9693e91 1. 简介 与前一篇An...
    王三的猫阿德阅读 5,995评论 1 9
  • 什么是Service 先看一下google官方的介绍: Service是一个可以在后台执行长时间运行操作而不提供用...
    Cris_Ma阅读 4,170评论 0 0
  • 四年级第二学期的某一天:“妈妈,我 要 踢 球”,你眼里透着坚定。 了解你的执拗,所以先答应着,但心里一直在思考各...
    坚持写作认真生活阅读 2,454评论 0 0
  • 《论语》中有个经典语录:“敏而好学,不耻下问,是以谓之文也。” 我常激励自己要努力成为两种俱乐部的成员,一个是终身...
    浩若烟海阅读 3,754评论 0 0