Service服务

  谷歌官方文档是学习android很好的地方,不过满篇的英文让人看着会很吃力,所以我打算将一些文档翻译出来,供大家去参考学习。当然本人的英文水平很有限,肯定有很多翻译不妥的地方,希望见谅。如果要转载,请注明出处,我会非常感激,并且努力继续做下去

概述:

  服务是一个应用程序组件,表示当应用程序没有和用户交互时想执行一个长时间的操作或者提供功能给其他的应用使用。每一个服务必须有相应的<service>声明在AndroidManifest.xml中。服务可以通过Context.startService()Context.bindService()开启。

  注意服务跟其他的应用对象一样,是运行在其宿主进程的主线程中的。这意味着,如果你的服务打算用来执行任何耗费CPU(如:mp3回访)或者阻塞操作(如:联网),那么应该产生一个子线程来做这些工作。关于进程与线程的更多信息可以在这 Processes and Threads找到。IntentService(意图服务)作为一个标准服务的实现类拥有自己的线程,可以在这里安排一些上述的工作。

课程主题包含:

  1.  什么是服务?
  2.  服务的生命周期
  3.  权限
  4.  进程生命周期
  5.  本地服务事例
  6.  远程消息服务事例

什么是服务?

 大多数关于服务类的困扰实际上是围绕着它不是什么:

  • 服务不是一个独立的进程。服务对象本身并不意味着运行在它自己的进程中;除非另有说明,它运行在同一进程中作为应用程序的一部分。
  • 服务不是一个线程。但它并不意味着在主线程中工作(为了避免应用程序无响应错误)。

 因此,服务本身事实上非常简单,它主要提供了两个特点:

  • 一个用于应用程序的工具,告诉系统它想在后台做一些事情(即使用户没有直接与应用程序交互)。这对应于调用Context.startService(),告诉系统给服务安排工作,然后一直运行,直到服务本身或其他人明显的停止它。
  • 一个用于应用程序的工具,将自己的一些功能暴漏给其他应用使用。这对应于调用Context.bindService(),允许一个长期存在的服务连接,为了可以和应用程序交互。

  当一个服务组件真正创建后,针对上述原因,那么系统实际上要做的就是实例化这个组件以及在主线程中调用onCreate()和其它适当的回调方法。这相当于服务实现了这些适当的行为,比如,创建一个子线程并在其中进行自己的工作

既然服务本身非常简单,所以你可以按照你想要的和服务进行简单或复杂的交互:从将其作为一个本地java对象直接调用到提供了完整的远程接口使用AIDL.

服务生命周期

   一个服务可以由系统运行有两个原因。如果某人调用Context.startService(),系统将会检索这个服务(如果需要的话创建它并且调用onCreate()方法)以及调用带有客户端提供参数的onStartCommand(intent,int,int)方法。这个时候服务会一直运行直到Context.stopService或者stopSelf()方法被调用。注意多次调用Context.startService()不会嵌套(尽管在多个响应结果中会调用onStartCommand()),所以无论启动了多少次服务都将会通过调用一次stopService()或者stopSelf()方法而终止服务。服务可以使用stopSelf(int)方法确保服务不会停止,直到开启服务的意图已经被处理。

  对于开始服务,有两种额外的主要的操作模式供我们选择,这取决于我们在onStartCommand()方法中的返回值:START_STICKY用于根据需要明显的开启和关闭服务,而START_NOT_STICKYSTART_REDELIVER_INTENT用于保持运行处理任何命令给服务(这点翻的不太通)。

  客户端也可以使用Context.bindService()来获得一个持久连接的服务。者同样会创建服务如果尚未运行(同时调用onCreate())但是不会调用onStartCommand(),客户端将会获得由onBind(intent)方法返回的Ibinder对象,允许客户端回调服务。只要服务连接一旦建立,服务将会持续的运行(不管是否持有一个引用在服务的Ibinder中)。通常Ibinder返回的是一个用aidl写的复杂接口。

  一个服务可以同时开启和连接绑定到它。在这种情况下,只要它是开启的或者至少有一个连接使用Context.BIND_AUTO_CREATE标志绑定到它,系统将一直使服务运行。一旦这两种情形都没有持有,服务的OnDestroy()方法将会被调用,服务将会有效的终止。所有的清理工作(停止线程、注销服务)都应该在返回onDestroy()方法时完成。

  下篇: service服务<二>


发布了46 篇原创文章 · 获赞 63 · 访问量 16万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章