Service总结

1. 一个Service基本上有两种形式:

被启动(Started)

当应用程序组件(如一个Activity)通过调用startService()方法启动的服务是“被启动(started)”的。服务一旦启动,它就能够无限期的在后台运行,即使启动它的组件被销毁。通常,一个被启动的服务之星一个单一操作,并且不给调用者返回结果。例如,这个服务可能在网络上下载或上传文件。当操作完成的时候,服务应该自己终止。

被绑定(Bound)

当一个应用程序组件通过调用bindService()方法绑定的服务是“被绑定(bound)”的。一个被绑定的服务会提供一个允许组件跟服务交互的客户端接口,用于发送请求、获取结果、甚至是跨进程的进程间通信(IPC)。一个被绑定的服务的运行时间跟绑定它的应用程序组件一样长。多个组件能够绑定一个服务,但是只有所有这些绑定解绑,这个服务才被销毁。

2.被启动类型:

调用startService()方法来启动服务,传递一个Intent对象,同时包含一些数据。服务在onStartCommand()方法中接受这个Intent对象。

能够继承两个类来创建被启动类型的服务:

Service

这是所有服务的基类。当你继承这个类时,服务要使用你的应用程序的主线程,降低应用程序正在运行的Activity的性能。

onStartCommand()方法必须返回一个整数,这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值

(START_NOT_STICKY),(START_STICKY),(START_REDELIVER_INTENT)

IntentService

这是一个Service类的子类,创建新的工作线程来依次处理所有的启动请求,需要实现onHandleIntent()方法,它接受每个启动请求的Intent对象,以便完成后台工作。

服务在前台运行

需要调用startForeground()方法,这个方法需要两个参数:一个唯一标识通知的整数和给状态栏的通知

3.被绑定类型:

创建具有绑定能力的服务时,必须提供一个IBinder对象,它用于给客户端提供与服务端进行交互的编程接口。有三种方法能够定义这个接口:

1. 继承Binder类

如果你的服务是你的应用程序的私有服务,并且跟客户端运行在同一个进程中,那么就应该通过继承Binder类来创建你的接口,并且佛从onBind()方法中返回这个接口的一个实例。客户端接收这个Binder对象,并且能够使用这个对象直接访问Binder类中实现的或Service中的公共方法。

当你的服务只是在后台给你自己的应用程序工作时,这是首选技术。不使用这种方法创建服务接口的唯一原因是因为你的服务要其他应用程序或跨进程使用。

class activity{
onStart() {  bindService(intent,serviceconnection,);}
ServiceConnection serviceconnection=new ServiceConnection(){
onServiceConnected(ibind)
{ ibinder ib=(ibinder) ibind 
ib.getservice(); }
onServiceDisconnected()
}
}

class LocalService{
class ibinder extends Binder{
LocalService getservice(){ return mservice; }}
}


2. 使用信使(Messenger)

如果你的接口要跨越不同进程来进行工作,那么你能用信使给服务创建接口。在这种方式中,服务定义了响应不同消息对象类型的处理器。这个处理器是一个信使的基础,它能够跟客户端共享一个IBinder对象,允许客户端使用Message对象给服务端发送命令。另外,客户端能够定义一个自己的信使,以便服务端能够给客户端发送消息。

这是执行进程间通信(IPC)最简单的方法,因为信使队列的所有请求都在一个单线程中,因此不需要针对线程安全来设计你的服务。

MessengerService{
class incominghandle extends Handler{
void handleMessage(Message msg){
}}
messenger mesg=new messenger(incominghandle){}
onBind(){
return mesg.getBinder();}}

MessengerActivity{
onStart(){
bindService(intent,serviceconnection,);}
ServiceConnection serviceconnection=new ServiceConnection(){
onServiceConnected(IBinder ibinder){
Messenger msg=new Messenger(ibinder);}
onServiceDisconnected(){}
}}


3. 使用AIDL(Android Interface Definition Language)

AIDL(Android 接口定义语言)执行所有的把对象分解成操作系统能够理解的原语的工作,并且把它们编组到执行IPC(进程间通信)的不同进程中。使用信使的技术实际上是基于AIDL架构。就像前面提到的,信使在一个单线程中创建了一个所有客户端请求的队列,因此服务每次只能接收一个请求。但是,如果你想要服务同时处理多个请求,那么就能直接使用AIDL,这种情况下,你的服务必须是多线程的并且要线程安全。

要使用直接AIDL,就必须创建一个定义编程接口的.aidl文件。Android SDK使用这个文件生成一个实现文件中定义的接口和处理IPC的抽象类,然后你能够在你的服务中进行扩展。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值