Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
两种启动方式:
1.Context.startService():开启一个service,该service不会因为启动他的组件的销毁而停止,并不与组件进行交互,运行到任务结束(stopself())或者Context.stopService()。结束用Context.stopService()
2.Context.bindService():开启可以交互的service,一个service可绑定多个组件,当所有组件都解除绑定后,service销毁。
start和bind并不冲突,可以先start再bind也可以先bind再start,但需要销毁时,若调用了bind则必须调用unbind,若调用start则必须调用stop,不分先后。
生命周期:onCreate()=>onStartConmand()/onBind()=>onDestroy()
注:service并不会开启新线程来执行任务,因此不能执行耗时操作。除非使用IntentService
IntentService是Service的子类,它使用工作线程逐一处理所有启动请求。如果您不要求服务同时处理多个请求,这是最好的选择。 您只需实现 onHandleIntent()方法即可,该方法会接收每个启动请求的 Intent,使您能够执行后台工作。
IntentService执行以下操作:
创建默认的工作线程,用于在应用的主线程外执行传递给 [onStartCommand()](https://developer.android.google.cn/reference/android/app/Service.html?hl=zh-cn#onStartCommand(android.content.Intent, int, int))的所有 Intent。
创建工作队列,用于将 Intent 逐一传递给 onHandleIntent()实现,这样您就永远不必担心多线程问题。
在处理完所有启动请求后停止服务,因此您永远不必调用 stopSelf()。
提供 onBind()的默认实现(返回 null)。
提供 [onStartCommand()](https://developer.android.google.cn/reference/android/app/IntentService.html?hl=zh-cn#onStartCommand(android.content.Intent, int, int))的默认实现,可将 Intent 依次发送到工作队列和 onHandleIntent()实现。