Service类

       Service类简介:

  一个Service是一个应用组件代表一个应用想要在不和用户交互的前提,去执行一个很长时间的操作。或者是提供功能给其他的应用去使用。每一个Service类必需有一个相符合<service>的声明在它自己的包AndroidManifest.xml中。Service能够开始执行通过Context.startService()和Context.bindService().

      注意:这些Services,像其他的应用对象一样,运行在它们自己的宿主的进程的主线程里。这个意思就是,如果你的service即将让CPU高速运行,或者是阻止操作,它会在其自己的线程去做这项工作。这个IntentService类是一个可以被利用的去实现Service在其自己的计划里去工作。

  

1.什么是Service?

   大多数的疑惑在这个Service类里面,事实在它有很多不是。

(1).一个Service它不是一个可分离的进程。Service对象它自己没有实现运行在它自己的进程,除非特指,它运行在一个相同的进程里作为一个应用的一部分。

(2).一个Service不是一个线程,它不是这个意思,它自己不会工作在主线程里(去避免应用长时间没有响应的的错误)

因此一个Service它自己是事实上是非常简单的,提供了两个主要的特点。

(1).一个应用的一个设备,去告诉系统它想要在后台做什么(即使用户不直接和这个应用交互的时候),为了响应调用Context.startService(),这要求系统的工作安排,直到这个服务被明确的停止。

(2).一个应用的一个设备,去暴露自己的功能给其他的应用程序。为了响应这个调用Context.bindService(),它允许一个长期的连接是为了服务与它进行交互。

当一个服务组件被创造的,其中一个原因,其实系统实例化组件并调用它的oncreate()和主线程上其他任何适当的回调。它是由服务实现这些与适当的行为,如创建辅助线程,它的工作。

注意 :因为Service它自己是如此简单的,你可以尽可能简单地与它交互,或者是完成你自己想做的。视它为一个本地Java对象你做出直接的方法调用(由当地服务的示例如图所示),提供全remoteable使用AIDL接口。

2.Service的生命周期

这里有两个原因,一个Service能够被系统运行,如果有人调用Context.startService(),然后系统将会取得这个Service(如果需要的话,创建它并且调用它的onCreate()方法),然后调用它的onStartCommand(Intent,int,int)方法将会带有从客户端提供的参数。这个Service一直会运行,直到Context.oStop()或者stopSelf()被调用。注意:多次调用Context.startServcie()并不会nest(尽管他们在onstartcommand()对应的多个调用结果),所以不管多少次开启一个Service将会停止Context.stop()或者stopSelf();然而,services能使用它的stopSelft(int) method去确定service没有被停止直到在进程中开启。


开启服务,有两个主要操作模式,它们可以决定运行,取决于他们onStartCommand()的返回值,start_stickly用于知道什么时候开始服务和停止服务,而start_not_sticky或者start_redeliver_intent是被使用给services仅仅保留正在运行,当把一些命令发给他们的时候。


客户端能够使用Context.bindService()去获得一个持久化的和Service的一个连接,这个同样地创建service,如果它没有运行(调用 onCreate()当这么做的时候),但是不会调用onStartCommand().客户端会付取得一个IBinder对象,以致于这个Service能够返回从它的onBinder(Intent)方法,允许这个客户端去回调这个service,这个service将会保留运行和connection建立一样长的时间(不管客户端持有一个引用在service的IBinder).通常这个IBinder为一个已经写了aidl的复杂接口返回。


一个service能开始并且和它的连接绑定。在一个例子中,这个系统将会保持这个service开始或者它们是一个或多个连接和它,用Context.BIND_AUTO_CREATE标志。一旦这个状态被持有,这个services的onDestroy方法被调用并且这个services被有效地中止。所有的清理(停止线程,解除注册接收器)应该是完整的ondestroy()回来时。


3.权限

当它被声明在它自己的mainfest的<service>标签,全局访问一个service是能够强制的。通过这样做,其他的应用将会需要去声明一个相符合<user-permission>的元素在它自己的mainfest去开始、停止、或者绑定到这个service作为一个姜饼(android 2.3版本),当使用Context.startService(Intent),你也能设置Intent.FLAG_GRANT_READ_URI_PERMISSION 与/或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION在这个Intent上。这个将会授予这个service临时访问这个指定的uris在这个Intent上。访问将会留下直到services已经调用stopSelf(int)对于开始命令或者之后,或者直到services已经完成停止。这个工作对于授予访问其他的应用,并不需要权限去保护这个service,即使当这个service一点也没有暴露暴露。


另外,一个service能够被独立的IPC保护。通过调用这个checkCallingPermission(String)方法在执行这个实现之前。



4.流程生命周期


Android系统会试图保持过程托管服务周围只要服务已开始或已绑定到它的客户。运行时内存不足和需要杀死现有的过程,一个过程的托管服务的优先级将以下的可能性更高:

如果该服务目前在其oncreate(),执行代码onstartcommand(),或ondestroy()方法,然后宿主进程将是一个前景过程中确保此代码可以执行不被杀的。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章