清晰地理解 Service
1.Service的start和bind状态有什么区别?
startService()
,开启一个服务,服务回调onStartCommand()
,其他组件的数据可以在服务中执行,但不可与服务交互。
bindService()
,绑定一个服务,服务回调bindService()
,该回调返回IBind对象,通过这一对象,其他组件可以和服务进行交互。
2. 同一个Service,先startService,然后再bindService,如何把它停止掉?
startService开启服务,当Service执行完以后,需调用stopSelf()
或 stopService()
方法停止Service。
bindService`绑定服务,当Service不再与组件绑定时,该Service将被destroy。
startService —> bindService —> unbindService —> stopService
3. 你有注意到Service的onStartCommand方法的返回值吗?不同返回值有什么区别?
START_NOT_STICKY
:若执行完onStartCommand()
方法后,系统就kill了service,不要再重新创建service,除非系统回传了一个pending intent。这避免了在不必要的时候运行service,您的应用也可以restart任何未完成的操作。START_STICKY
:若系统在onStartCommand()
执行并返回后kill了service,那么service会被recreate并回调onStartCommand()
。dangerous不要重新传递最后一个Intent(do not redeliver the last intent)。相反,系统回调onStartCommand()
时回传一个空的Intent,除非有 pending intents传递,否则Intent将为null。该模式适合做一些类似播放音乐的操作。START_REDELIVER_INTENT
:若系统在onStartCommand()
执行并返回后kill了service,那么service会被recreate并回调onStartCommand()
并将最后一个Intent回传至该方法。任何 pending intents都会被轮流传递。该模式适合做一些类似下载文件的操作。START_STICKY_COMPATIBILITY
START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
而输入参数flags正是代表此次onStartCommand()
方法的启动方式,正常启动时,flags默认为0,被kill后重新启动,参数分为以下两种
4. Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?
Service 运行在主线程当中,不是在新的线程,也不再新的进程,因此我认为Service的这三个方法都运行在主线程中。