Android API 指南 - 【服务 Service】

来源:互联网 发布:51单片机最小系统焊接 编辑:程序博客网 时间:2024/05/01 18:22
服务属于应用程序组件,它可以在后台执行长耗时操作且无需提供用户界面。其他的程序组件可以启动一个服务,当用户切换至别的程序后这个服务仍可以继续运行。此外,一个组件可以通过和一个服务相绑定来进行交互,甚至执行进程间通信(IPC)。比如,一个服务可以处理网络事物、播放音乐、执行文件IO或者与ContentProvider交互,所有这些操作都是在后台进行的。

通常,服务有两种形式:

1)Started:当一个程序组件(如Activity)执行了startService(),服务就被“Started”(启动)。一旦启动,服务就可以在后台持续运行,即使启动它的组件被销毁。一般情况下,被启动的服务只执行单一的操作且不会给调用者返回任何结果。例如,某个服务通过网络下载或上传文件,当任务完成,服务会自行终止。

2)Bound:如果一个程序组件通过调用bindService()与服务相关联,这个服务就被“Bound”(绑定)。此时的服务会提供一个“服务器-客户端”接口,通过这个接口程序组件可以与服务交互、向服务发送请求、接收服务返回的结果甚至执行进程间通信。这样的服务与跟其相绑定的组件的生存时间是一致的。一个服务可以和多个组件绑定,但是当所有的组件都解绑后,服务就会被销毁。

上文虽然分开介绍了服务的两种形式,但事实上服务可以同时以两种形式运行:服务可以被“启动”,同时也可以被“绑定”。关键在于你是否实现了一对回调方法:onStartCommand()允许组件启动服务、onBind()允许绑定服务。
不论你的程序是如何启动、绑定(或者启动+绑定)的,任何程序组件都可以使用服务(甚至是来自不同的程序),跟任何组件都能使用Activity一样的方式——通过Intent启动。当然,你可以在Manifest文件中把服务定义成私有来阻止其他程序的访问,下文会具体介绍。
注意:服务运行在其宿主进程的主线程中——服务不会运行于独立进程中(除非另行指定)也不会创建新线程。这意味着,如果服务希望执做任何耗CPU任务或者阻塞操作(比如音乐播放或网络操作),你需要在服务内新开线程来执行它们。通过另启线程,可以降低ANR的风险,并且让主线程专注于处理用户交互。


基础

要创建一个服务,必须实现Service的一个子类。在实现中,我们需要重写一些处理服务生命周期关键事件以及提供绑定机制的回调方法。其中需要重写的最重要的回调方法有:
1)onStartCommand():当其他组件通过调用startService()要求服务启动时会执行这个方法。一旦这个方法被执行,服务就会启动并在后台持续运行。如果实现了这个方法,我们就需要在工作完成后通过调用stopSelf()或者stopService()来终止服务(如果只想采用绑定方式,就不需要实现这个方法)。
2)onBind():当其他组件想通过调用bindService()与这个服务绑定时(比如执行RPC),系统会执行这个方法。在这个方法的实现中,必须通过返回IBinder的方式提供一个接口以使客户端与服务相交互。这个方法是必须实现的,如果想要禁止绑定,可以返回null。
3)onCreate():当服务被首次创建时此方法会被调用,来执行一次性的初始化操作(先于onStartCommand()和onBind())。如果服务已经在运行,这个方法就不会执行。
4)onDestory():如果服务不再被使用且正在被销毁时这个方法会被调用。此方法的实现中应该清理诸如线程、注册的监听器和接收器等资源。这将是服务接收到的最后一个方法调用。

0 0
原创粉丝点击