class MainApplication : Application() {
companion object {
lateinit var application: Application
get
}
override fun onCreate() {
super.onCreate()
application = this
// 初始化第三方库
}
}
复制代码
1.2 获取 Activity & Service 对象
同样地, Activity & Service也是Context的实现类,那么我们就可以在程序运行过程中,按需初始化第三方库。例如使用Glide时,并不需要一开始就调用Glide#with(Context),只需要在显示图片的时候调用即可;
1.3 小结
- 优点
最常用的方式,实现简单,没有性能 / 稳定性风险;可以按需初始化第三方库 & 懒加载
- 缺点
需要获取ApplicationContext / Context(依赖方与库代码强耦合),不利于组件化
下面,我将介绍两种无侵入获取Context的方法,将涉及到Android进程的启动流程,若还不了解,请务必阅读文章:《Android | 带你理解 Application 的创建过程》
2. 反射 ActivityThread 获得 ApplicationContext(不推荐)
这一节介绍一种通过ActivityThread.java获得Application的方法,具体如下:
2.1 源码分析
我们都知道,在启动四大组件(Activity、Service、ContentProvider, BroadcastReceiver)时,如果对应的进程未启动,就需要先创建进程,相应地也会创建一个Application对象,即:
- 在system_server进程,通过AMS#get