您的位置:首页 > 产品设计 > UI/UE

[API GUIDE学习笔记]Service

2015-06-28 17:04 204 查看
一、可以把service分成两种类型:

1. start service:独立运行

2.bound service:类似于client和server的形式,可以和客户端交互。

以下几个特点:

1、onStartCommand(Intent intent, int flags, int startId)函数:在使用startService()方法启动service的时候,会回调这个函数。使用bindService()方法启动service的时候,不会调用这个函数。 调用者可以使用intent来传递数据。

onStartComman的返回值有以下几个:

a.START_NOT_STICKY:被系统杀死后不重启。

b.START_STICK:被系统杀死后,重启。

c.START_REDELIVER_INTENT:被杀后,系统会保存它的intent,再伺机重启。

2、IntentService 类:如何需要处理多线程,使用start service的一个好方案是,使用IntentService类。它会创建一个工作线程去处理所有的请求,只要重载onHandleIntent即可。IntentService创建一个工作队列,把所有的请求都加到队列,再一个一个传给工作线程处理。等队列里的任务处理完成,就调用stopService().

3、start service返回结果:可以使用PendingIntent的broadcast,在service完成的时候,通过这个broadcast返回结果。

二、Bound services

创建一个Bound Service需要提供一个IBinder,有三种方法提供IBinder:

1、Extending the Binder class:如果你的服务是作为自己应用程序的后台服务,那么你可以使用这种方式。由于没有跨进程通讯,你可以获取自定义的IBinder的所有方法。甚至是service的所有公共方法或者是自定义类的所有公共方法。代码参考api文档。

2、Using a Messenger:可以实现简单的跨进程通讯,单线程处理。实现步骤参考API文档。基本原理是,通过构造一个包含Hander的Messager,把Hander传递给客户端。

3、Using AIDL:下节介绍。

三、Android Interface Definition Language

1、客户端和服务端约定的语言,把objects 转换成系统可以理解的基元,再把他们按顺序投递。

2、AIDL的方法是直接函数的调用。

a.service的本地线程调用AIDL的方法,会在同一个线程响应。

b.跨进程调用AIDL的方法,会从线程池里面去线程来响应。

3、定义AIDL的接口。

把接口定义到.aidl的文件中,客户端和服务端都需要这份接口文件。SDK Tools会自动生成java接口文件(在gen/文件夹里)。service要实现IBinder的方法,客户端绑定到service,就能访问IBinder的方法。

aidl的参数和返回值可以是任何类型。但是传递objects的时候,需要实现
Parcelable
接口,具体参考API文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: