目录
一、Context是什么?
在Android中,Context是一个抽象类 ,它代表了应用程序的当前状态,包括资源和类加载器等,它提供了一个应用运行所需的信息,比如我们要获取资源 ,那么需要她,启动Activity,获取系统服务等,都会需要它。
Context允许应用程序访问系统的资源和接口,以及执行与应用程序环境相关的操作。它是连接应用程序与Android系统之间的桥梁。所以我们Activity、Application都继承了它。
可以理解为它应用赖以生存的运行环境。
二、Context的关系
- Context是一个抽象类
- ContextImpl是实现了Context,提供了具体的功能,
- ContextWrapper没有提供特殊的,只是包含了context,主要是ContextImpl
- ContextThemeWrapper多了一个主题。 Activity的父亲是ContextThemeWrapper,它提供了对主题资源的访问功能,因为只有Activity涉及到UI显示。
- Activity、Application、Service可以直接拿到到Context,本身就是Context
三、Context源码分析
我们可以看看源码。
Context是一个抽象类
ContextWrapper里面封装了ContextImpl
ContextImpl里面就实现了很多功能。
我们看看Activity
可以看到Activity本身就是一个Context,所以我们可以直接使用this,就可以代表context。
四、Application、Activity、Service的Context的区别、内存泄漏问题
生命周期:
● Application的context:与Application的生命周期相关,context随着Application的销毁而销毁,伴随application的一生,与activity的生命周期无关。
● Activity的context:与Activity的生命周期相关,Activity可以销毁多次,那么属于Activity的context也会销毁多次。
内存泄漏
● Application的context:引用Application的context不会导致内存泄漏,因为它的生命周期与整个应用程序的生命周期一致。
● Activity的context:引用Activity的context可能会导致内存泄漏,特别是当引用对象的生命周期超过了当前Activity的生命周期时。
资源访问:
● Application的context:通常用于访问应用程序级别的资源,如全局变量、应用主题、资源文件中的内容等。
● Activity的context:通常用于访问与当前Activity相关的资源,如启动新的Activity、加载布局文件、创建对话框等。
所以,
● 在一个应用程序中,context的数量并不是固定的,它取决于应用程序中Activity、Service和Application的数量。
● 对于单进程应用程序来说,通常只有一个Application实例,因此只有一个Application的context。但是,如果有多个Activity和Service,那么就会有多个对应的context。