思维导图是个好东西,可以把知识串在一张图上,更便于理解记忆。
概述
Context是一个抽象基类。在翻译为上下文,也可以理解为环境,提供一些程序的运行环境基础信息
子类关系
封装类ContextWrapper
- ContextThemeWrapper(带主题的封装类)
- Activity
- Service
- Application
实现类ContextImpl
内存泄露问题
- 静态资源导致的内存泄漏
解决方案:避免使用静态资源,或者使用弱引用来解决相应。 - 单例模式导致内存泄漏
解决方案:使用getApplicationContext(),这样使用单例与Activity就无关了,Activity释放时则不会出现内存泄露
获取Context
- View.getContext()
返回当前View对象的Context对象,通常是当前正在展示的Activity对象 - Activity.getApplicationContext()
获取当前Activity所在应用进程的Context对象,通常使用Context时,优先考虑全局进程Context - ContextWrapper.getBaseContext()
获取一个ContextWrapper装饰之前的Context,在实际开发中使用并不多,不建议使用 - Activity.this
返回当前Activity实例,UI控件需要使用Activity作为Context对象
总结
- Context共有三种类型,Application、Activity和Service
整个App共一个Application对象 - Context数量 = Activity数量 + Service数量 + 1(Application)
- 三个类都属于Context,功能是由ContextImpl类去实现的
- 大多数场景下,三种类型的Context可以通用
- 特殊场景不可通用(只能使用Activity类型的Context,否则将会出错)
- 启动Activity
安全考虑,Android不允许Activity或Dialog凭空出现,Activity的启动必须要建立在另一个Activity的基础上,以形成返回栈 - 弹出Dialog
Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog)
- 启动Activity