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。
Service重要的知识点总结
最新推荐文章于 2022-06-11 15:21:03 发布