Android类-Service

Service是app的组件,能够为app执行长时间运行的不与用户交互的服务,或者为其它app提供某功能。
每个Service必须在其 AndroidManifest.xml中做声明。

1 Service两种生命周期

如下图所示展示Service完整生命周期和活跃生命周期,左边的图展示了用startService()创建的服务的生命周期,右边的图展示了用bindService()创建的服务的生命周期。
这里写图片描述

  • Started服务
    当调用Context.startService()时,系统会创建service(必要时调用service的onCreate()方法),然后调用onStartCommand()方法。
    如果你选择实现onStartCommand()回调方法,那么你就必须显式地终止服务,因为此服务现在已经被视为started了。这种情况下,无论是否还存在客户端与其绑定,此服务都会运行下去,直至自行用stopSelf()终止或由其它组件调用stopService()来终止。
    应用场景:通过网络下载或上传文件。当操作完成后,服务应该自行终止。
  • Bound服务
    Client也可以使用Context.bindService()方式去绑定Service。当service没启动时,会调用service的onCreate()方法,但是不会调用onStartCommand()方法。 然后Android系统会调用服务的 onBind() 方法,返回一个用于和服务进行交互的 IBinder。当Client从Service的onBind(Intent)方法中得到Ibinder对象,client可以成功回调service。当有client连接到service时,Service会一直运行。
    绑定是异步进行的。 bindService() 将立即返回,并不会向客户端返回 IBinder 。为了接收 IBinder ,客户端必须创建一个 ServiceConnection 的实例,并把它传给 bindService()。 ServiceConnection 包含了一个回调方法,系统将会调用该方法来传递客户端所需的那个 IBinder。
    一旦服务被所有客户端解除绑定,则Android系统将会销毁它(除非它同时又是用onStartCommand()started)。因此,如果你的服务就是一个纯粹的bound服务,那你就不需要管理它的生命周期——Android系统会替你管理,根据是否还有客户端对其绑定即可。

Note:
1 只有activity、服务和content provider才可以绑定到服务上——你不能从广播接收器(broadcast receiver)中绑定服务。
2 如果仅当你的activity可见时才需要与服务进行交互,则你应该在onStart()中进行绑定,并在onStop()中解除绑定。
3 服务仍可以同时用两种方式工作—可以是started(一直运行下去),同时也能被绑定。 只会存在一点麻烦,是否两个回调方法都要实现:实现onStartCommand()以允许组件启动服务、实现onBind()以允许绑定。

2 Permissions:

如果要全局访问Service,需要在manifest文件中增加标签。在其它的 app中需要声明元素,才能启动,停止或者绑定该service.

3 Process生命周期

Android系统会尽量保持service进程正常运行,当系统memory低,需要删掉已有的processes时,带有service的进程会有较高优先级:
- 当service正在执行onCreate(), onStartCommand()或onDestory()方法时,此process会变成foreground process,确保不会变系统kill
- 当service已经启动后,进程的优先级会低于那些对用户可见的process,但是高于那些对用户不可见的process
- 当有client绑定到Service时,Service的进程优先级不会低于最重要的client
- 启动后的Service可以调用 startForeground(int, Notification) API,把当前的Service变成foreground状态。

4 Service分类和Demo

1 创建Started Services两种方法:

(1)直接继承 Service类
这是所有服务的基类。如果你要扩展该类,则很重要的一点是:请在其中创建一个新的线程来完成所有的服务工作。
(2) 扩展IntentService类
这是Service类的子类,它使用了工作(worker)线程来处理所有的启动请求,每次请求都会启动一个线程。如果服务不需要同时处理多个请求的话,这是最佳的选择。 所有你要做的工作就是实现onHandleIntent()即可,它会接收每个启动请求的intent,然后就可在后台完成工作。
Demo见附件Github链接

2 创建Bound Services三种方法:

创建一个支持绑定的服务时,你必须提供一个 IBinder,用作客户端和服务间进行通信的编程接口。定义这类接口的方式有三种:
(1) 扩展Binder类:
如果你的服务只是为你自己的应用程序执行一些后台工作,那这就是首选的技术方案。不用这种方式来创建接口的理由只有一个,就是服务要被其它应用程序使用或者要跨多个进程使用。
Demo见附件Github链接
(2) 使用Messenger :
这是执行进程间通信(IPC)最为简便的方式,因为Messenger会把所有的请求放入一个独立进程中的队列.
Demo见附件Github链接
(3)使用AIDL:
你的服务必须拥有多线程处理能力,并且是以线程安全的方式编写的。将在下节中详细讲解。

5 Reference:

Github Demo: https://github.com/lewiyue/AndroidDev
Service: http://www.android-doc.com/reference/android/app/Service.html
AIDL: http://www.android-doc.com/guide/components/aidl.html
Bound Services: http://www.android-doc.com/guide/components/bound-services.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值