Android文档笔记:服务(一)

来源:互联网 发布:服务器端口开启 编辑:程序博客网 时间:2024/06/06 02:54
服务

- 不提供UI而能够在后台持续执行操作的组件
- 即使用户界面已经切换到其它应用,服务仍然能够在后台运行
- 一个组件可以绑定到一个服务,以同它交互,甚至跨进程通信

服务的两种形式:
- 启动服务:
>应用程序组件通过调用startService()来发起。一旦启动则无限期的执行,即使发起的组件已经销毁。通常这样的服务执行执行单独的操作,且不向调用者返回结果。例如下载或上载文件。当操作完成,服务需要自我关闭。

- 绑定服务:
>当一个程序组件通过调用bindService()而绑定到服务,我们称其为“绑定的”。绑定服务提供了一个客户-服务器接口来允许组件与服务进行交互,发送请求,取得结果,甚至跨进程进行通信。服务尽在其它组件绑定到它期间执行。一次可以有多个组件绑定到同一个服务。当所有组件全部解绑时,服务将被销毁。

一个服务可以同时以两种形式工作,只看你实现了哪些回调方法:
- onStartCommand:启动
- onBind():绑定

无论是启动还是绑定,任何程序组件都可以使用服务,好比任何组件可以通过Intent来启动和使用活动。

注意:服务跑在进程的主线程里。服务并不为自己创建线程,也不泡在单独的进程里(除非你专门指定)。那么,如果要做CPU占用高或者阻塞性的操作(MP3播放,网络通信),你要在服务中创建新的线程来完成,以避免ANR。


基础

创建服务:创建一个Service的子类,覆盖一些回调。这些回调处理相关的生命周期,以及提供组件绑定到服务的机制

主要的回调:
- onStartCommand():
应用程序组建启动服务(startService())时,由系统进行调用。
一旦执行,服务将无限期的跑下去。因此,工作完成之后,应当调用stopSelf()或stopService。

- onBind():
应用程序组件请求绑定到服务(bindService())时,系统调用此回调。
必须提供一个客户端用于与服务通信的接口,并返回一个IBinder对象。
此回调必须实现。但如果不希望被绑定,可以返回null。

- onCreate():
服务第一次被创建的时候由系统调用。
在启动或绑定之前执行一次性初始化。

- onDestroy():
> 当服务不再被使用,由系统调用以将其销毁。
>具体的服务类应通过此方法来清楚占用的资源,如线程、注册过的listener、receiver等等。
> 这是服务所接收到的最后一次调用。

>对于启动式的服务,在服务自我停止(stopSelf())或其它组件将其停止(stopService())后被销毁。
> 对于绑定,一旦所有组件全部解绑,则系统将其销毁。

> 只有在内存低并且必须为用户当前关注的活动腾出系统资源时,服务才可能被安卓系统强制停止。
> 如果服务与当前活动绑定,服务很难被杀掉。
> 如果服务被声明为运行于前台,它也几乎永远不会被杀掉。
> 否则,服务一旦启动并长时间运行,久而久之,系统就会不断提高它被杀的优先级。
> 一旦资源回来,系统会重启服务。这样,就需要在服务中为重启做一些设计。

在manifest中声明服务
============================
<manifest... >
  ...
  <application ...>
     <service android:name=".ExampleService"/>
     ...
 </application>
</manifest>

===========================
- 可规定:
> 启动服务所需要的权限
> android:name是唯一必要的属性
> 可定义intent过滤器:服务被其它应用用到
> android:exported:服务是否归本应用私有
原创粉丝点击