在Android中使用native程序(非Java)来广播intent

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

首先在看之前必须确定你已经部分了解广播intent的原理(从Java层到native层)。如果一窍不通的话,请先百度看完。

进入正题,广播intent从Java层最终会调用binder机制来触发native层的发送,即发送消息BROADCAST_INTENT_TRANSACTION,而这个消息是通过IActivityManager接口处理的,所以我们在程序中必须先获得这个接口,即如下:

sp sm = defaultServiceManager();

sp am = sm->checkService(String16("activity"));

然后我们就得到了am,然后可以继续使用transact函数来通过消息发送intent。

当然这里我们还需要一个intent,但是怎么在native程序中创建intent呢?

首先我们需要创建一个Parcel,这是binder经常使用的一个数据包类。

创建完成后,进行填充,如下所示:

1. data.writeInterfaceToken(String16("android.app.IActivityManager"));

2. data.writeStrongBinder(NULL); /* caller */

/* intent */

3. data.writeString16(String16(action_str)); /* action */

4. data.writeInt32(URI_TYPE_ID); /* Uri - type */

5. data.writeString16(String16(uri_str)); /* uri string if URI_TYPE_ID set */

6. data.writeString16(NULL, 0); /* type */

7. data.writeInt32(0); /* flags */

8. data.writeString16(NULL, 0); /* package name */

9. data.writeString16(NULL, 0); /* ComponentName */

10. data.writeInt32(0); /* source bound - size */

11. data.writeInt32(0); /* Categories - size */

12. data.writeInt32(0); /* selector - size */

13. data.writeInt32(0); /* ClipData */

14. data.writeInt32(-1); /* bundle(extras) size */

/* end of intent */

第一行:当发送消息BROADCAST_INTENT_TRANSACTION时,会检查token,如果不是IActivityManager.descriptor则会返回false,当然这里只会打出一段warning信息,不会发送失败。

第二行:这里是发送这个binder请求方。

第三行:这个是需要发送intent的action(android.intent.action.*)

第四行:这里写入了一个int值,可以有四个,其中三个分别对应三种uri类型:

NULL_TYPE_ID:0

StringUri.TYPE_ID:1

OpaqueUri.TYPE_ID:2

HierarchicalUri.TYPE_ID:3

第五行:这一行存在与否依赖于第四行,规则如下:

如果是NULL_TYPE_ID:该行不可存在

如果是StringUri.TYPE_ID:该行必须是writeString16写入uri地址

如果是OpaqueUri.TYPE_ID:可以看Uri.java中OpaqueUri类readFrom函数,由多个part组成。

如果是HierarchicalUri.TYPE_ID:可以看Uri.java中HierarchicalUri类readFrom函数,由多个part组成。

第六行-第十三行:在后面的注释都有解释。

第十四行:这一行是用来确定有多少extras(即映射参数),比如”key”=”1234”,可以使用getString获得。

{ /* Extras */

data.writeInt32(-1); /* length */

data.writeInt32(0x4C444E42); // 'B' 'N' 'D' 'L'

int oldPos = data.dataPosition();

{ /* writeMapInternal */

data.writeInt32(1); /* size */

data.writeInt32(VAL_STRING);

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

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

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

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

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

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

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

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

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

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

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

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

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

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