在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!

人工智能实验室
相关文章相关文章
  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

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

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...