Android Context

本文详细解析了Android中Context的概念及其重要性。从抽象的角度到具体的源码层面,介绍了Context作为应用运行环境的角色,并探讨了其在Activity、Service及Application中的实现方式。同时,文章还强调了正确使用Context以避免内存泄漏的注意事项。

相信很多人多会问Context到底是什么?

·我们可以理解为“上下文”:它贯穿整个应用;

·也可以理解成“运行环境”:它提供了一个应用运行所需要的信息,资源,系统服务等;

·同样可以理解成“场景”:用户操作和系统交互这一过程就是一个场景,比如Activity之间的切换,服务的启动等都少不了Context。

然而以上这些都是我们从抽象角度去理解Context的作用,那么从Code代码来看Context到底是什么呢?Activity是一个Context,Application是一个Context,Service也是一个Context你信么?

从源码看Context就是一个抽象类,里面定义了各种抽象方法,包括获取系统资源,获取系统服务,发送广播,启动Activity,Service等。所以从源码角度看Context就是抽象出一个App应用所有功能的集合,由于Context是一个纯的抽象类,所以它的具体的方法实现是在其之类ContextImpl中实现了,稍后分析。我们平时在MainActivity中会这么给mContext = this赋值,其言外之意就是当前Activity类就是Context,那说明Activity是Context的子类。通过Android Studio查看Context的子类图如下:


Context继承关系图


Context类是一个抽象类,具体实现在ContextImpl类中;而ContextWrapper是Context的一个包装类,其里面所有的方法实现都是调用其内部mBase变量的方法,而mBase就是ContextImpl对象,稍后分析。然而ContextWrapper还有一个ContextThemeWrapper子类,该类中扩展了主题相关的方法。有继承关系图可以看出,Application和Service是继承自ContextWrapper,而Activity是继承自ContextThemeWrapper,是不是有点奇怪?其实一点都不奇怪,Activity在启动的时候系统都会加载一个主题,也就是我们平时在AndroidManifest.xml文件里面写的android:theme=”@style/AppTheme”属性啦!然而Service和Applicaton都和UI界面并没有卵关系!因此他们继承自ContextWrapper。所以Activity,Application,Service其实都关联着一个mBase变量,而mBase变量是ContextImpl对象的赋值,也是真正实现抽象类Context的地方。虽然Activity,Application,Service都有一个共同的祖先Context,但是他们自己本身持有的Context对象是不同的, 

Context总结

1.Context是什么?Context是”运行上下文环境“,从代码角度看Application,Service,Activity都是Context。

2.所有Context都是在应用的主线程ActivityThread中创建的,由于Application,Service,Activity的祖先都是Context抽象类,所以在创建它们的同时也会为每一个类创建一个ContextImpl类,ContextImpl是Context的之类,真正实现Context功能方法的类。因此Application,Service,Activity都关联着一个ContextImpl对象。

3.尽量少用Context对象去获取静态变量,静态方法,以及单例对象。以免导致内存泄漏。

4.在创建与UI相关的地方,比如创建一个Dialog,或者在代码中创建一个TextView,都用Activity的Context去创建。然而在引用静态资源,创建静态方法,单例模式等情况下,使用生命周期更长的Application的Context才不会导致内存泄漏。


参考:

Android Context 是什么? 

<think>好的,用户让我介绍一下Android中的Context。首先,我需要回忆一下自己对Context的理解。ContextAndroid开发中确实是一个基础且重要的概念,但刚接触的时候可能会有点混淆。 用户可能是一位刚开始学习Android开发的程序员,或者对Android内部机制感兴趣的人。他们可能在使用某些API时遇到了需要传递Context的情况,但不清楚它的具体作用和不同场景下的使用区别。需要从基础开始解释,同时确保内容结构清晰,帮助他们逐步理解。 首先,应该定义Context是什么。根据官方文档,Context是应用程序环境的接口,提供访问资源和类的方法,以及执行应用级操作。接下来,需要区分不同的Context类型,比如Application Context、Activity Context和Service Context。这部分很重要,因为错误使用可能会导致内存泄漏或其他问题。 然后,要详细说明每种Context的使用场景。例如,Activity Context用于和UI相关的操作,而Application Context更适合需要生命周期无关的场景。需要举一些例子,比如显示Toast、启动Activity、获取资源等,说明应该使用哪种Context。 还需要提到常见的错误使用情况,比如在单例或静态变量中持有Activity Context导致的内存泄漏,以及如何避免这些问题。这部分对实际开发很有帮助,能帮助用户避免常见的陷阱。 另外,可能需要补充一些代码示例,但根据用户的要求,可能不需要具体的代码,而是用文字描述。但要注意结构清晰,分点说明。 最后,总结Context的重要性,并强调正确使用不同类型的Context的必要性。这样用户能有一个全面的认识,并知道在实际开发中如何应用这些知识。 需要检查是否有遗漏的重要点,比如Context提供的具体功能,如访问资源、启动组件、获取系统服务等。这些都需要涵盖到,确保回答全面。同时,要确保语言简洁,避免过于技术化的术语,让初学者也能理解。 可能还需要比较Application Context和Activity Context的区别,特别是在生命周期方面的差异。例如,使用Application Context启动Activity时需要添加FLAG_ACTIVITY_NEW_TASK标志,而Activity Context则不需要。这样的细节能帮助用户更深入理解。 总之,回答的结构应该是:定义、类型、功能、使用场景、常见问题及注意事项。这样逻辑清晰,逐步引导用户理解Context的作用和正确使用方法。</think>### Android Context 详解 #### 1. **定义与作用** Context(上下文)是 Android 系统中**应用程序环境的全局信息接口**,核心功能包括: - 访问应用资源(字符串、图片、布局等) - 启动组件(Activity、Service、Broadcast) - 获取系统服务(如定位、传感器) - 操作文件与数据库 #### 2. **Context 类型** | 类型 | 生命周期范围 | 典型场景 | |---------------------|---------------------|-----------------------------| | **Application** | 应用级(全程存活) | 全局单例、长生命周期操作 | | **Activity** | 界面级(随界面销毁)| UI操作、启动其他界面 | | **Service** | 服务级(随服务终止)| 后台任务相关操作 | #### 3. **核心功能对比** $$ \text{Application Context} \neq \text{Activity Context} $$ - **Activity Context**: - 包含界面主题信息 - 可直接启动新Activity - 示例:`startActivity()`、`getLayoutInflater()` - **Application Context**: - 无法执行界面相关操作 - 启动Activity需添加标志: `intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)` #### 4. **典型使用场景** - **正确案例**: ```java // 显示Toast(可用Application) Toast.makeText(getApplicationContext(), "提示", Toast.LENGTH_SHORT).show(); // 启动Activity(必须用Activity Context) Intent intent = new Intent(this, NextActivity.class); startActivity(intent); ``` - **错误案例**: ```java // 错误:静态变量持有Activity Context public class Utils { private static Context sContext; // 可能导致内存泄漏 } ``` #### 5. **内存泄漏防范** - **问题根源**: Activity被销毁后仍被其他对象引用 → 无法被GC回收 - **解决方案**: 1. 优先使用Application Context 2. 使用WeakReference弱引用 3. 及时解绑广播接收器、监听器 #### 6. **进阶理解** - **ContextImpl**: Context的具体实现类,系统通过它管理资源访问 - **ContextWrapper**: 包装类模式,Activity/Service等组件通过继承它扩展功能 #### 总结 ContextAndroid开发的核心枢纽,正确理解其类型差异和生命周期管理,可有效提升应用性能和稳定性。关键原则:**UI操作用Activity Context,全局操作用Application Context,避免非必要引用**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值