四级没过写android翻译——service

20 篇文章 0 订阅
16 篇文章 0 订阅

服务http://developer.android.com/guide/components/services.html




服务是一个不提供界面的应用程序组件,该组件可以在后台执行耗时操作。其他的应用程序组件可以启动服务,即使用户切换到其他的应用程序,服务仍可以在后台继续运行。另外,一个组件可以绑定一个服务并与之交互甚至执行IPC。例如,一个服务可以处理网络事务、播放音乐、执行文件的I/O操作,或者与内容提供者交互,这些交互都在后台执行。


本质上,一个服务可以采取两种形式:
启动:
当一个应用程序组件(例如:activity)通过执行startService()即可启动服务。一旦启动,服务即可立即在后台运行,即使启动它的组件被销毁。通常,被启动的服务顺序执行操作且不返回结果给启动它的组件。例如,它可以通过网络下载或者上传文件。当操作结束,服务应该结束它自己。
绑定:
当一个应用程序组件通过执行bindService()即可绑定一个服务。绑定服务以一种C/S模式接口展现,它允许组件与服务交互,发送请求,获取结果,甚至执行跨进程的IPC。一个可以绑定的服务仅仅当另一个应用程序组件去绑定它才会运行。多个组件可以一次绑定到服务,但是当它们全部解除绑定,服务会被销毁。

尽管这篇文档通常分开讨论这两种服务,但是你的服务可以以这两种方式工作,它可以启动(无限期的运行)和绑定。It’s a simply a matter of 你是否实现一个对回调方法:onStartCommand()允许组件去启动服务,onBind()运行组件去绑定服务。

不管你的应用是启动、绑定、还是既启动又绑定,任何应用程序组件都可以使用服务(甚至包括来自独立的应用)。任何组件都可以使用activity的Intent以同样的方式启动服务。然而,你可以为了阻止其他其他程序的进入在Manifest文件中声明服务类型为私有,这个问题的更多讨论在“在manifes中声明服务” 章节中。
注意:服务运行在他进程的主线程当中,服务不创建它自己的线程,除非你特别指定,服务不运行在单独的进程。这意味着,如果你的服务将要执行CPU密集型工作,如:播放MP3或者网络操作,你应该在服务内部创建新的线程来做这些工作。通过使用独立的线程,你将会减少ANR错误的风险,同时,应用程序的主线程可以继续专注于用户与你的activities的交互。

基本的:
创建一个服务,你必须创建一个Service的子类或者已存在的Service的子类。在你的实现类中,你必须重写一些回调方法处理服务生命周期的关键环节,如果有必要,提供组件绑定到服务的机制。你需要实现的最重要的方法如下:
onStartCommand()
当其他组件如activity通过调用startService()请求启动服务,系统调用此方法。一旦此方法执行,服务即被启动并立即在后台运行。如果你实现了此方法,当服务的工作完成时,你有必要调用stopSelf()或者stopService()终止服务(如果你仅仅希望提供绑定,此方法不必实现)。
onBind()
当其他组件想通过调用bindService()绑定服务(如执行RPC)时,系统调用此方法。在你的对此方法的实现中,你必须通过返回一个IBinder对象实现客户端与服务交互的接口。此方法你必须实现的,但是,如果你不运行绑定,你应该返回null。
onCreate()
当服务第一次启动执行一次初始化程序的时候(在调用onStartCommand()或者onBind()之前),系统调用此方法。如果服务已经运行,此方法不会被调用。
onDestory()
当服务不再使用将要被销毁的时候系统调用此方法。你的服务应该实现此方法来清理任何资源,如线程,注册的监听器,接收者等。这是服务接收到的最后一方法

如果一个组件通过调用startService()启动服务(这将导致调用onStartCommand方法),服务会一直保持运行直到它调用stopSelf()或者其他组件通过调用stopService()才会停止。

如果一个组件通过调用bindService()创建一个服务(onStartCommand()不会被调用),then the service runs only as long as the component is bound to it,一旦所有的客户端从服务解绑,系统会销毁服务。

Android系统仅仅在内存低的时候和用户强制系统恢复activity的系统资源时才会强制结束服务。如果用户强制结束一个绑定到activity的服务,此服务不太可能被干掉。如果服务被声明为在前台运行(稍候讨论),它几乎永远不会被干掉。另外,如果服务已经启动并长时间运行,随着时间的推移,系统将会把它放在后台任务列表的低(优先级)位置,同时服务变的更容易被干掉,如果你的服务将被启动,你必须巧妙的设计处理被系统的重启。如果系统干掉了你的服务,当资源再次变的可以系统会重启服务(不过,这依然依赖你从onStartCommand()的返回值,稍候讨论)。更多系统可能会在何时销毁服务的信息,参考文档:Processes and Threading。


在接下来的章节,你将会看到如何创建各种类型的服务和如果在其他组件中使用。

待续 2013-05-18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值