Content即上下文对象,在我们android开发中随处可见,并不陌生。在加载资源、启动一个新的Activity、获取系统服务、获取内部文件(夹)路径、创建View操作时等都需要Context的参与,可见Context的常见性。大家可能会问到底什么是Context,Context字面意思上下文,或者叫做场景,也就是用户与操作系统作的一个过程,比如你打电话,场景包括电话程序对应的界面,以及隐藏在背后的数据;
但是在程序的角度Context又是什么呢?在程序的角度,我们可以有比较权威的答案,Context是个抽象类,我们可以直接通过看其类结构来说明答案:
由此我们可以看到,Application、Activity、Service都是Context的子类。
Activity和Application创建的context的区别:
- 他们虽然的都继承的Context类,但是Activity相对于Application多一个名为ContextThemeWrapper的父类。该类包含了主题(Theme)相关接口,即android.theme属性指定的。
- Application在app运行开始时创建,环绕整个app,他的context相对于Activity更持久
引用保持:
存在这样的情况,当引用一个工具类,需要访问资源,那么就避不开context的参与。在这样的情况下就得注意Context的引用问题。
当你在工具类中传入一个Activity的Context。而我们这个工具类是一个static的强引用。那么问题就来了。也就是说这个Activity在整个程序停止运行前都无法被回收销毁。这样就成为了造成内存泄漏的风险。那么我们不用强引用,改为弱引用,是不是就可以了?答案是不行的,因为很有可能出现因为Activity被回收,导致context为null,造成NullPointException。
为了避免这种情况,我们此时就应该使用Application的Context。因为他们的生命周期是相同的。这样我们就可以避免内存泄漏的问题。
Context的应用场景:
总结:
Context上下文对象,抽象类。是Activity、Service、Application的主类。在传递、使用context的时候,最重要的考虑应该是他的引用保持时间,避免造成内存泄漏、NullPointExcepiton等问题。
网友评论