了解应用启动相关代码的同学一定知道:
我们的应用启动时,每个进程会对应一个ActivityThread对象,而Application对象在正常情况下也是每个进程只有一个?
但是如果你看ActivityThread的源码,你会发现:
public final class ActivityThread {
final ArrayList<Application> mAllApplications
= new ArrayList<Application>();
...
}
问题来了:
- 什么情况下一个ActivityThread对象,会对应多个Application对象,即mAllApplications.size() > 1;
- 如果找到了1的情况,支持这个目的是?
本问题归因为好奇,硬说使用场景在一些插件化中会尝试构造Application会调用这个,但是这个肯定不是google的本意。
更多问答 >>
-
每日一问 | Gson中序列化对象的操作有低侵入的优化方案吗?
2021-12-02 00:50 -
每日一问 UndeclaredThrowableException 是什么异常?
2021-12-02 00:50 -
每日一问 | android hidden api 不是禁用反射,以及如何突破,「元反射」不行了?
2022-02-08 23:51 -
每日一问 | 如何构造一个 hide interface 的实现类?
2022-02-08 23:51 -
每日一问 | 关于 Activity 重建,值得探究的几个问题
2021-08-30 21:37 -
每日一问 | ViewModel 在什么情况下的「销毁重建」能够对数据进行无缝恢复?
2021-08-25 18:11 -
每日一问 | 我们经常说到的 Android 脱糖指的是什么?
2021-07-11 22:06 -
2021-07-11 22:06
-
每日一问 | Dialog 的构造方法的 context 必须传入 Activity吗?
2021-07-11 22:06
问题1:
撇开插件化的场景,mAllApplication 有一个场景会使用到,就是多个 App 运行在同一个进程的情况。
2 个 App 运行在同一个进程的场景:
问题2:
用处:回调 ComponentCallbacks2。
全局搜了 mAllApplications 使用的地方,会通过 collectComponentCallbacks() 获取 ComponentCallbacks2 的 ArrayList,包含 Application、Activity 等;
分别会在 3 个地方使用,都是内存 & 配置相关的回调,等于是在配置和内存环境变动的时候,通知到 Application。
若有其他场景,大家再补充。
意思1、2、3情况会处于同一进程(同一签名也会?学到了),持有application集合主要是为了发生对应事件时方便回调集合中application的对应方法?