Service API文档 翻译

Service API文档

官方:http://developer.android.com/reference/android/app/Service.html
相关博客:http://www.oschina.net/question/565065_67906 讲得挺详细
类信息:public abstract class Service extends ContextWrapper implements ComponentCallbacks2
直接子类:AbstractInputMethodService, AccessibilityService, CarrierMessagingService, DreamService,HostApduService,IntentService,JobService,MediaBrowserService, MediaRouteProviderService等
间接子类:InputMethodService
简介:Service是Android四大组件之一,它的设计是用来执行那些不需要与用户交互的,而需要长时间在后台运行的操作,它也可以用来为其他的应用提供服务。所有的service类都必须在AndroidManifest.xml文件中进行声明(与Activity类似)。
需要注意的是,Service是运行在应用的主线程中的,这就意味着当我们需要处理耗CPU或耗时任务时,如MP3播放或网络连接,我们需要为这些操作另起线程。 IntentServices在Service使用线程处理任务方面提供了一个标准实现。
下面将从以下方面介绍Service:
1、 什么是Service?
2、 Service的生命周期
3、 Service许可(Permissions)
4、 进程的生命周期
5、 本地Service使用示例
6、 远程Service服务示例

**

1. 什么是Service?

**
大多数关于Service的困扰集中在以下方面:
○1一个Service并不等同与一个线程。实际上Service是运行在应用主线程上的,和Activity的UI线程是同一个,因此我们要注意不要再Service中处理耗时任务,以免出现无响应错误。
○2一个Service并不是一个独立的进程。除非特别指定,Service默认是作为它所在进程的一部分运行的。
其实Service本身是比较简单的,主要提供以下两个功能:
○1由于Service不像Activity一样,拥有自己的界面,因此它可以用来执行后来任务。当用户没有在与应用A操作,而去操作应用B时,那么A就可以启动一个服务来执行一些操作,比如QQ到后台后,需要保持联网查询数据,这类服务一般通过startService启动,通过startService启动的服务即使启动它的组件已经退出,它仍会一直运行,直到完成任务的时候自刎(自己调用stopSelf())或者被其他人下黑手(调用stopService())。(本地服务)
○2Service的另一大功能就是提供远程服务了。应用A可以将自己的功能以服务的方式向其它应用开放。这类服务一般通过bindService启动,当启动这个Service的应用退出后,这个服务会自动关闭。(远程服务 结合AIDL实现)
Service的生命周期
我们有两种方式启动一个Service,分别是通过startService和bindService方法,对应着两种不同的生命周期。如图:
这里写图片描述
下面分别讨论这两种不同的生命周期:
通过startService启动: 当我们调用startService方法启动一个服务时,如果这个Service是第一次启动运行,那么他会首先执行onCreate方法,然后执行onStartCommand方法开始Service的工作。即使这个Service所在的应用已经退出,它仍会一直运行,直到这个Service调用stopService方法结束自己,或者其他程序调用stopService(Intent)来关闭它。 需要注意的是,如果当我们调用startService启动一个Service的时候,这个Service已经在其他地方启动过了,那么onCreate不再执行,而直接执行onStartCommand方法。同时,即使我们多次使用startService方法启动一个服务,当我们使用stopSelf()和stopService(intent)时,这个Service会直接关闭。另外,由于可能存在多次启动,Service还提供一个stopSelf(int)方法,这个参数int指示了具体是哪一次启动的Service,如果int不是代表最新的一次启动,那么就不能关闭这个Service,它能保证所有提交给Service的任务都能被妥善处理。
通过bindService启动:采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务绑定在一起。 如果访问者要与服务进行通信,那么,onBind()方法必须返回Ibinder对象。如果访问者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。
一个服务可以先通过startService启动,再通过bindService绑定到这个服务,此时将不会重复执行onCreate方法。 但是任何时候只要onDestory方法被调用,这个Service就会被关闭。这里需要注意的是onDestory执行的条件是所有与Service的连接全部断开。如果当我们调用stopService或者unbindService的时候还存在于Service的连接,那么onDestory就不会执行。

2. 访问许可

如果我们需要这个Service是全局可访问的,那么我们必须在AndroidManifest.xml文件的service 标签中声明。这样,当其他应用需要访问时,在他们自己的AndroidManifest.xml文件中通过标签来获得这个访问许可。
在android2.3以后,当我们通过startService(intent)启动服务时,我们只需要设置Intent.FLAG_GRANT_READ_URI_PERMISSION and/or Intent.FLAG_GRANT_WRITE_URI_PERMISSION,即可获得这个Service的临时访问许可。这个许可会持续到stopSelf(int)被调用,或者Service本身已经停止。这种临时访问许可适用于其他APP没有请求这个Service的许可或者这个Service根本就没有设置”exported”标签时。
进程的生命周期
Android系统会尝试使这个进程与它所拥有的Service一直运行,当剩余内存过低而不得不杀掉一些进程时,以下情况将使得拥有正在运行的Service的进程将获得比较高的优先级:
 当这个服务正在执行它的onCreate(), onStartCommand(), or onDestroy()方法时,它所在的进程将作为前台进程,来保证这些方法能被完整执行;
 当一个进程启动一个服务时,他会被认为优先级仅次于当前正在显示的进程。但是即便如此,我们也应当注意,他还是可能在内存极低时被杀死,我们应该做好准备,这样的事情有可能会发生。同时,长时间在后台运行的Service更可能被杀死。
 如果有客户端应用绑定到这个服务,那么这个服务的优先级和所有与他绑定的应用中的最高优先级保持一致。我们可以通过BIND_ABOVE_CLIENT, BIND_ALLOW_OOM_MANAGEMENT, BIND_WAIVE_PRIORITY, BIND_IMPORTANT, and BIND_ADJUST_WITH_ACTIVITY来设定客户端应用对Service的优先级影响。
 在我们启动Service的时候我们也可以使用startForeground(int, Notification)方法,他会使得这个Service获得极高优先级,它只会在特别极端条件下才会被系统杀死。

3. 类翻译:

常量:
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
公共方法:
01、 public final Application getApplication ()
返回这个Service所在的应用对象。
02、 public abstract IBinder onBind (Intent intent)
返回可以与这个service联系的通道对象Ibinder。可以返回null,当不允许客户端与service绑定时。Ibinder对象完整实现了AIDL中的描述内容。
03、 public void onConfigurationChanged (Configuration newConfig)
当设备配置发生改变时这个方法将被调用。但是与Activity不同,Service并不会重启,而只需要在这里更新适应新配置的引用即可。
04、 public void onCreate ()
当第一启动这个Service对象时会执行这个方法。而在后续启动或绑定中将不再执行。
05、 public void onDestroy ()
当执行到这个方法时,标识这个Service对象即将被销毁,我们应该在这里面去释放她所应用的资源,比如线程、注册的广播接收者等等。我们不应该手动调用这个方法。
06、 public void onLowMemory ()
这个方法将在系统内存极度紧缺时被调用,不过它所在的进程将会比其与没有service的进程优先级更高。 在这个方法中我们应该释放资源,比如缓存等等,当这个放返回后,系统垃圾回收器会开始工作。在android4.0以后应该使用onTrimMemory方法来完成资源清理工作。
07、 public void onRebind (Intent intent)
这个方法的调用时机API文档说得不怎么清楚,结合我查找的资料解释如下:
当activityA通过bindService绑定到serviceA,此时将执行onBind方法;如果activityA后来退出了(但是serviceA仍然在运行),那么onUnbind将会得到执行,默认的onUnbind返回false,如果我们希望当activityA下次启动时再绑定到serviceA时,会执行onRebind方法而不是onBind方法,那么就让onUnbind方法返回true。有一点复杂。
08、 public int onStartCommand (Intent intent, int flags, int startId)
每一次通过startService启动Service的时候都会调用这个方法。
参数:intent 就是startService(intent)中传入的。 当这个service所在进程已经关闭,并且这个方法返回过除START_STICKY_COMPATIBILITY以外的其它值时,这个service在重启时,参数intent可能会是null。
Flags 这次启动请求的附加数据。可能是0, START_FLAG_REDELIVERY, or START_FLAG_RETRY.
startId 代表本次启动service的代号。在stopSelfResult(int)中使用。
返回值:这个返回值标识系统应该如何对待这个Service。它的值可能是START_CONTINUATION_MASK标志之一。
09、public void onTaskRemoved (Intent rootIntent) add in android 4.0
10、public void onTrimMemory (int level) add in android 4.0
11、public boolean onUnbind (Intent intent)
当绑定的客户端退出,或主动调用unbindService方法时,onUnbind将会被调用。默认的实现,它将会返回false,如果希望客户端下次启动时执行onRebind方法,则应该使其返回true。
12、public final void startForeground (int id, Notification notification)
使这个Service运行到前台,这时会显示一个通知。
13、public final void stopForeground (boolean removeNotification)
停止在前台运行,但是它会继续在后台运行。
14、public final void stopSelf ()
停止service的运行。
15、public final void stopSelf (int startId)
与stopSelfResult (int startId)相同,只是没有返回值。
16、public final boolean stopSelfResult (int startId)
如果startId是最近一次启动时的ID值,则停止这个service。这个startId就是onStartCommand (Intent intent, int flags, int startId)中的第三个参数。
如果startId确实对应于最近一次启动时的startId就返回true。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值