Android Service和Binder、AIDL

  次阅读 作者:智能小宝 来源:互联网 2016-01-13 22:15 我要评论(0)

1.首先理解service的作用和生命周期,

由于activity如果切换,那么他就不再运行,那么我们想在玩游戏的时候听播放器中的音乐,activity就应运而生了,这是最常见的一种场景,同时service由于它的优先级比较高,不容易被回收,而且是独立进程,不会阻塞UI线程,因此,可以用来处理一些比较费时的任务。

service起于startService(),终于stopService,如果没有调用stopService,那么,即使调用者结束了,该service也一直存在。

也可以通过bindService来绑定service,unBindService分开并结束service。如果bind的时候没有启动service,那么它会调用service的create方法启动。

多个程序可同时bind同一个service,只有他们都unbind了,这个service就会自动结束。如果有部分unbinder的时候调用stopservice,这个stop也会等到它们全部结束的时候才真的结束。

2.service的种类,

由于adroid的独特的线程模型,service被同一个apk调用和不同apk调用原理是不同的,因此分成以下两种:

(1). 本地服务(Local Service):说白了就是在同一个apk内被调用。

(2). 远程服务(Remote Sercie):被另外一个apk调用。

3.涉及到的内容:

由于android的进程模型,不同的apk不能共用数据,因此如果有需要的话需要通过进程间通讯完成。

进程间通讯(ipc)涉及到三个部分:客户端(调用方),传递数据,服务端(被调用方)。

android的数据传递类似于RPC过程,采用aidl的方式传递,考虑到效率的原因,没有用java内置的serializable,而是采用原始数据拆分组装的parcel方式。

4.场景假设:

一个service提供产生Student数据的功能,作为服务端,一个apk中的activity想获取另一个apk中的一个学生。根据上边的分析,service即使服务端,activity即使客户端,student是要传输的数据,要被包装成pacel传递。

5.根据android思想,理想的传递过程:

student提供拆分成parcel的writeToParcel()方法和根据Parcel组装的构造函数Student(Pacel p);

一个bissiness Service(bizSvc)用来实现逻辑功能。

一个android service(adSvc)调用bizService提供功能。

一个MyBinder负责service描述符与bizService的映射(本地服务时供queryLocalInterface查找)和与客户端交互。(如果被本地调用,就查找到相应的service直接操作,不用远程通讯,如果被远程调用,就得负责与远程通讯)

一个Proxy负责在客户端提供transact()方法发送数据。

具体的调用过程如下:

调用的时候,客户端首先调用bindService(new Intent ("abc"), serviceConnection,Context.BIND_AUTO_CREATE);激活serviceConnection的onServiceConnected方法,在此方法中获取到一个binder(注:clientBinder,系统给我们的一个与远程进行通信的binder,不是我们刚才自己实现的),此binder能够查找系统中注册的service,如果没有查找到该Service,那么可认定该service是从其他apk获得的,就创建一个此service的静态代理类Proxy,否则,就把这个service返回,供客户端调用。

服务端收到这个Intent后,激活adSvc的onBind方法,创建一个MyBinder返回。之后,这个MyBinder负责与客户端的Proxy通信。

之后,客户端要调用service的方法,可直接调用(本地)或者通过代理调用(远程),这个Proxy调用clientBinder的transact方法,参数为要掉用的方法(TRANSACRION_XX),发送的参数(_data),接受的返回值(_reply),把消息传送给服务端。

服务端收到消息后,调用MyBinder的onTransac方法,根据Proxy传递过来参数,调用bizService不同的方法,并把产生的值组装成Parcel发送回去。之后客户端Proxy会自动调用sudent的相关方法,把数据重新组装,进行下一步处理。

理想的代码如下(这是理想的代码,经过拆分,但是不符合android的aidl规范,不能运行,见下文分析):

客户端代码

final IMyBizService bizSvc;

bindService(new Intent("abc"),new ServiceConnection(){

@Override

public void onServiceConnected(ComponentName name, IBinder clientBinder) {

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...