Android系统的Binder机制之二 服务代理对象(1)

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

上文《Android系统的Binder机制之一Service Manager》我们学习了Service Manager在Android Binder中的作用服务(Service)注册,服务(Service)查询的功能。本文我们一起学习服务(Service)在客户端中的代理机制。重点介绍其核心对象BpBinder。

1、服务代理的原理

如下是客户端请求service服务的场景:

1、首先客户端向Service manager查找相应的Service。上文《Android系统的Binder机制之一Service Manager》有比较详细的介绍。注意客户端和Service可能在两个不同的进程中。

2、Android系统将会为客户端进程中创建一个Service代理。下文将详细介绍该创建过程。

3、客 户端视角只有Service代理,他所有对Service的请求都发往Service代理,然后有Service代理把用户请求转发给Service本 身。Service处理完成之后,把结果返回给Service代理,Service代理负责把处理结果返回给客户端。注意客户端对Service代理的调 用都是同步调用(调用挂住,直到调用返回为止),这样客户端视角来看调用远端Service的服务和调用本地的函数没有任何区别。这也是Binder机制的一个特点。

2、Android进程环境ProcessState类型和对象

Android系统中任进程何,要想使用Binder机制,必须要创建一个ProcessState对象和IPCThreadState对象。当然如果 Android进程不使用Binder机制,那么这两个对象是不用创建的。这种情况很少见,因为Binder机制是整个Android框架的基础,可以说 影响到Android方方面面。所以说了解这两个对象的作用非常重要。

台湾的高焕堂先生一片文章《认识ProcessState类型和对象》,可以在我的博文《(转)高焕堂Android框架底层结构知多少?》中找到。可以先通过这篇文章对ProcessState进行一个大概了解。

ProcessState是一个singleton类型,一个进程只能创建一个他的对象。他的作用是维护当前进程中所有Service代理(BpBinder对象)。一个客户端进程可能需要多个Service的服务,这样可能会创建多个Service代理(BpBinder对象),客户端进程中的ProcessState对象将会负责维护这些Service代理。

我们研究一下创建一个Service代理的代码

1: sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)

2: {

3:sp<IBinder> result;

4:

5:AutoMutex _l(mLock);

6:

7:handle_entry* e = lookupHandleLocked(handle);

8:

9:if (e != NULL) {

10:// We need to create a new BpBinder if there isn't currently one, OR we

11:// are unable to acquire a weak reference on this current one.See comment

12:// in getWeakProxyForHandle() for more info about this.

13:IBinder* b = e->binder;

14:if (b == NULL || !e->refs->attemptIncWeak(this)) {

15:b = new BpBinder(handle);

16:e->binder = b;

17:if (b) e->refs = b->getWeakRefs();

18:result = b;

19:} else {

20:// This little bit of nastyness is to allow us to add a primary

21:// reference to the remote proxy when this team doesn't have one

22:// but another team is sending the handle to us.

23:result.force_set(b);

24:e->refs->decWeak(this);

25:}

26:}

27:

28:return result;

29: }

getWeakProxyForHandle函数的作用是根据一个binder句柄(上文《 Android系统的Binder机制之一Service Manager 》提到Binder驱动为每个Service维护一个Binder句柄,客户端可以通过句柄来和Service通讯)创建对应的Service代理对象。

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

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

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

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

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

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

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

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

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

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

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

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

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

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