Context 宏观来说是一个描述应用程序全局信息的场景,当然,本质上来说,这个“场景”其实是一个抽象类,它是一个应用程序的“灵魂人物”,从下面的图中就可以发现 Activity、Service、Application 都是 Context 的子类:
![](https://img.haomeiwen.com/i8807337/515a6b44081e217c.png)
Context 虽然无所不在,但是某些特定场景下需要使用特定的 Context,如启动一个弹窗,必须是依赖于 Activity 的,所以,使用 Dialog 必须传入当前 Activity 场景下的 “context”,关于 Context 的作用域可以参考下图:
![](https://img.haomeiwen.com/i8807337/79dfce787d7b93cc.png)
详细来龙去脉可参考上面两篇文章。
其他问题,如:
- getApplication()和getApplicationContext()的区别?
-
Context
导致的内存泄漏问题? - 正确使用
Context
的姿势?
1.Context是个抽象类 Activity跟Application跟Service都间接继承于他
2.Context简称上下文 。Android不像java程序一样,随便创建一个类写个main方法就能跑了,它需要有一个完整的上下文环境,即context,像启动activity/broadcast receiver /service 都需要用到他。
3.context导致的内存泄漏多是长生命周期去持有了短生命周期的实例造成的。像工具类如果需要context的话,能传applicationCOntext 最好传它。
4.getApplication()跟getApplicationContext() 本质没有区别 后者就是把返回的application强转成context传回来而已。返回的都是同一个对象,只是前者只能在Activity跟Service中可以使用,作用域不同。
5.Context数量 = Activity数量 + Service数量 + 1 如果多个进程的话 后面就不是+1 而是加多个
6.ContextWrapper里面有一个attachBaseContext()方法,目的是将Context参数传给mBase,之后的调用系统方法如getPackageName()之类的都是委托mBase实例来做的,所以在调用这个方法之前 是无法调用系统方法的。
构造函数-->attachBaseContext()-->onCreate()
。所以在onCreate()中或者重写这个方法后调用都可以。
@Override
protected void attachBaseContext(Context base) {
// 在这里调用Context的方法会崩溃
super.attachBaseContext(base);
// 在这里可以正常调用Context的方法
}
篇幅原因,先不做详细讲解,后面会一一通过答题方式来探索。
最后,再推荐一篇关于 Context 的深度好文:Mastering Android context
网友评论