Android Intent 解析之二

Android Intent 解析之二

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

服务端Intent运行过程:

Sticky:这个类型的BroadCast表示某些Intent须要被保留,当新的应用起来后,须要关注这个消息,可是呢,又不须要启动这个应用来接收此消息,比方耳机插入等消息。
这个函数的主要作用就是依据这个Intent的特点,构造BroadCastRecord添�到不同的列表,等待被处理;
这样发送就到了以下这个函数中了:

控制到了scheduleBroadcastsLocked这里,它的逻辑非常easy:

private final void scheduleBroadcastsLocked() {        

    if (mBroadcastsScheduled) {           

 return;      

    }       

    mHandler.sendEmptyMessage(BROADCAST_INTENT_MSG);        

    mBroadcastsScheduled = true;

}

先 推断mBroadcastsScheduled是否为真,假设为真就直接返回,这个变量主要是实现scheduleBroadcastsLocked和 processNextBroadcast之间的顺序运行,后面会看到在processNextBroadcast函数里面会把它设置为false; 以下就是通过BROADCAST_INTENT_MSG消息放入到消息队列里面,最后传递给mHandler,从这个角度来说Intent最后也是通过线程本身的消息队列来实现Intent的分发的;

消息分发过程:

mHandler收到BROADCAST_INTENT_MSG这个消息后便调用processNextBroadcast(boolean fromMsg)将消息分发出去了。以下介绍一下这个函数的流程:
1, 先推断fromMsg,假设是通过消息发送过来的就为真,否则为假; 假设为真mBroadcastsScheduled = false,这种话在函数scheduleBroadcastsLocked里面就能够再次发送BROADCAST_INTENT_MSG的消息从而触 发processNextBroadcast函数被再次调用;

2, 先推断mParallelBroadcasts是否为空,不为空就開始调用这个列表里面的receivers来接收消息,这个过程后面在串行intent 的时候也会碰到,我们留到后面讨论,这里仅仅须要知道它通过一个while循环把Intent发送给关注这个Intent的全部的receivers;

3, 再推断 mPendingBroadcast是否为空,假设不为空,就表示先前发送的串行的Intent还没有处理完成,一般出现这样的可能是由于我们要发送到的 receiver还没有启动,所以须要先启动这个activity,然后等待起来的这个activity处理,这时候,这个 mPendingBroadcast就为true;假设发送这样的情况须要推断这个Activity是否死了,假设死了,那么就把 mPendingBroadcast设为false,否则就直接返回,继续等待;

4, 接下来就顺序的从 mOrderedBroadcasts里面取出BroadCastRecord消息,然后对这个消息的receiver一个一个的调用其接收流程,注意这 里要把这个BroadCast的全部的receivers串行发送,都发送完了,才会进入到下一个BroadCastRecord消息;对于这个消息的处 理,先推断其接收者是不是BroadFilter,假设是,就调用deliverToRegisteredReceiver来接收,它的处理流程和前面的 处理并行BroadCast一样。

5,假设不是BroadCast Filter,就须要找出这个reiver所在的进程,这时候通常就是一个IntentFilter所在的进程,假设这个进程活着,那么就调用processCurBroadcastLocked(r, app)来处理。否则须要先启动这个进程,这就是startProcessLocked做的事情,然后设置mPendingBroadcast = r,这样等应用起来它会处理这个消息,后面会有进一步的说明;

到这里这个函数就结束了,比較复杂,里面另一些安全的检查等等,上面遗留了三个问题:
A)deliverToRegisteredReceiver的处理流程; B)processCurBroadcastLocked的处理流程; C)startProcessLocked以后的进程怎样处理这个唤醒它的Intent;

deliverToRegisteredReceiver
这里也分为这个receiver是否启动,假设已经启动就通过binder调用到了接收 activity的进程里面了。
processCurBroadcastLocked的逻辑
它和deliverToRegisteredReceive的终于区别,仅仅在于一个调用的是ScheduleRegisterdReceiver,一个是scheduleReceiver,这两个函数最后都会进入到目标activity的线程;
processCurBroadcastLocked

从这里能够看出最后通过Process.start启动了ActivityThread.java的进程,我们看看这个线程启动后的运行逻辑 首先是在进入主循环之前调用attachApplication通过binder调用进入到activityManagerService.java的进程; 这 个server进程在把我们先前设置的mPendingBroadcast设置为null,表示这个pending的broadcat已经得到处理了,然后调用 processCurBroadcastLocked来处理这个broadcast消息,最后通过 app.thread.scheduleReceiver进入到目标线程的接收流程;:

OK,到这里的话全部的发送分发流程已经结束了,剩下的就是两个接收函数还没有讨论一个就是ScheduleRegisterdReceiver,一个是scheduleReceiver;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118471.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一篇读懂无线充电技术(附方案选型及原理分析)「建议收藏」

    一篇读懂无线充电技术(附方案选型及原理分析)「建议收藏」一文读懂无线充电技术(附方案选型及原理分析)0.背景1.无线供电特点2.无线供电原理及实现方式3.现有解决方案分析4.FAQ及相关测试5.参考资料0.背景现今几乎所有的电子设备,如手机,MP3和笔记本电脑等,进行充电的方式主要是有线电能传输,既一端连接交流电源,另一端连接便携式电子设备充电电池的。这种方式有很多不利的地方,首先频繁的插拔很容易损坏主板接口,另外不…

    2022年5月7日
    52
  • log4cpp 使用完全手册「建议收藏」

    log4cpp 使用完全手册「建议收藏」原文链接 点击打开链接一、log4cpp概述     Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下:提供应用程序运行上下文,方便跟踪调试;可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等;可以动态控制日志记录级别,在效率和功能中进行调整;所有配置可以通过配置文件进行动态调整;多语言支持,包括Ja…

    2022年7月13日
    22
  • 企业微信api,企业微信sdk接口「建议收藏」

    企业微信api,企业微信sdk接口「建议收藏」企业微信api,企业微信sdk接口1、企业微信SDK接口API调用-企业微信好友收发消息/***给企业微信好友发消息*@authorwechat:happybabby110*@bloghttp://www.wlkankan.cn*/@AsyncpublicvoidhandleMsg(ChannelHandlerContextctx,TransportMessagevo,StringcontentJson…

    2022年10月2日
    3
  • springboot连接多个数据库

    springboot连接多个数据库今天接到一个新的需求,需要把自己数据库某个表的数据迁移到别的数据库中,于是百度,中间出现了一些细节的问题,解决花了点时间,在此记录一下,下次避免出现过的错误这里把连接一个数据库的情况也记录一下,好做对比一、连接一个数据库1.启动类@SpringBootApplication//扫描mapper映射类所在路径@MapperScan(basePackages="com.xh….

    2022年6月25日
    53
  • ITRS/GCRS/J2000坐标系的相互转换

    ITRS/GCRS/J2000坐标系的相互转换ITRS GCRS J2000 坐标系的相互转换本文主要阐述了目前国际天文界最新规定的岁差章动模型 IAU2000A B 并根据此模型给出 ITRS GCRS 和 J2000 平赤道地心系相互转换的详细步骤 本文主要依据 IERSConventi IERSTechnica 32 而来 由于文章为英文 且详细叙述了 ITRS GCRS 参考系以及岁差章动等模型 会使

    2025年11月18日
    2
  • idea2020.2激活码(JetBrains全家桶)

    (idea2020.2激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    267

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号