Service重要的知识点总结

  • 1.Service的start状态和bind状态的区别

    start状态

    context.startService()->onCreate()->onStartCommand()->serviceRunning->Context.stopService()/stopSelf()->onDestory();

    注意:IntentService中会自动调用stopSelf();

    如果多次调用context.startService()方法来启动同一个服务,onCreate()只在第一次执行,onStartCommand()则会执行多次。

    acticity调用startService ()启动的Service,该service有自己的生命周期,与activity的生命周期无关.

    bind状态

    context.bindService()->onCreate()->onBind()->ServiceRunning->unbindService()->onDestory();

    如果acitivty多次调用bindService()来启动同一个服务,onCreat()只会执行一次,onBind()也只会执行一次。

    acticity调用onBind()方法启动service,则service的生命周期依赖于activity,activity退出时,service也随之销毁。

  • 2.同一个service,先startService,再bindService如何把它停止掉?

    无论startService被调用多少次,只需stopService(或者stopSelf)一次就行。

    如果是同一个对象,调用n次bindService,则只需调用一次该对象的unbindService()。

    如果是n个不同的对象,分别调用一次bindService,则需要每一个对象分别执行对应的unbindService()一次。

    注意:unbindService()方法是区分对象的。

    只要分别调用了这两个方法,service的onDestory()方法就会执行,跟顺序没有关系。

  • 3.你有注意到Service的onStartCommand方法的返回值?不同返回值的区别

    常规操作,除非死之前还有组件调用startService,否则系统不会保留启动状态也不会重启该service。

    START_NOT_STICKY = 2 (0x00000002)

    service杀死后,保留启动状态,但不保存intent,之后系统会尝试重启该service,并重新回调onStartCommand方法。如果接下来没有其他的start命令,intent会为null,因此要注意onStartCommand对intent的判断。这是也是系统默认的策略。

    START_STICKY = 1 (0x00000001)

    service被杀死后,系统将会组织一次service重启(除非在那之前调用stopSelf方法),被杀死前最后一次传递的inent将被重新执行,该flag不会传递空的intent。

    START_REDELIVER_INTENT = (0x00000003)

    为了兼容版本,在service被杀死后,并不保证onStartCommand会被再一次调用。

    START_STICKY_COMPATIBILITY = 0 (0x00000000)

  • 4.Service的生命周期中的方法onCreat(),onStart(),onBind()等运行在那个线程中?

    service默认运行在主线程中,其生命周期也运行在主线程中。

    因此如果在service中执行耗时操作,则必须另起线程或者用IntentService,否则可能会产生ANR。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值