清晰地理解 Service

清晰地理解 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的这三个方法都运行在主线程中。

坚持原创技术分享,您的支持将鼓励我继续创作!