Android Service是一个能够在后台执行长时间运行操做而不提供用户界面的应用组件,它分为两种工做状态,一种是启动状态,主要用于执行后台计算;另外一种是绑定状态,主要用于其余组件和Service的交互。须要注意的两点:android
防止ANR风险,主线程运行的Service在执行耗时操做,则应在服务内建立新线程来完成这项工做,这能够下降发生“应用无响应”(ANR) 错误的风险。app
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } }
Service须要重写重要的回调方法有如下几个ide
像Activity(以及其余组件)同样,您必须在应用AndroidManifest.xml清单文件中声明全部服务函数
<service android:name=".MyService"/>
经过Context启动一个Service,这会致使对 onStartCommand() 的调用,则服务将一直运行,直到服务使用 stopSelf() 自行中止运行,或由其余组件经过调用 stopService() 中止,以下所示ui
startService(new Intent(this, MyService.class));
但在Android8.0的应用尝试在不容许其建立后台服务的状况下使用 startService() 函数,则该函数将引起一个 IllegalStateException。 新的 Context.startForegroundService() 函数将启动一个前台服务。this
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(intent); } else { startService(intent); }
而且在在service里再调用startForeground方法,否则就会出现ANR线程
context.startForeground(SERVICE_ID, builder.getNotification());
经过Context绑定一个Service,且未调用 onStartCommand(),则服务只会在该组件与其绑定时运行,一旦该服务与全部客户端之间的绑定所有取消,系统便会销毁它,以下所示代理
bindService(new Intent(this, MyService.class), connection, BIND_AUTO_CREATE);
注意:系统内存不足时,Android会强制中止优先级低的Service来提供内存给Activity使用,但持有Activity的Service可能不会终止,或者前台运行的Service几乎永远不会终止。code
首先咱们先看下Service的类的调用流程
Service最终建立须要须要经过Handler进行消息发送来实现建立,并把建立好的servic存储在ArrayMap中。接下来看下Service的生命周期是怎样的。
Service绑定跟Service的启动了类调用流程基本一致,只是相关方法改成bind,但其最后会调用ServiceConnection对象的onServiceConnected方法。接下来看下Service的生命周期是怎样的 但其有一个特性,屡次绑定同一个Service时,Service的onBind方法只会执行一次,除非Service被终止了。