Context 是 Android 框架中的核心类,提供应用运行的环境信息,它封装了应用的资源配置、主题样式、应用级别操作(如启动活动、获取系统服务)等功能,是访问应用资源的入口。
Context 类型 | 生命周期 | 典型使用场景 | 特点与限制 |
---|---|---|---|
Activity Context | 与 Activity 生命周期一致 | 启动新活动、显示对话框、获取界面资源 | 不可长期持有,易导致内存泄漏 |
Service Context | 与 Service 生命周期一致 | 后台任务、绑定服务 | 需谨慎使用,避免阻塞主线程 |
Application Context | 应用生命周期内有效 | 单例模式、全局工具类、数据库操作 | 无 UI 相关功能,生命周期最长 |
启动活动
Intent intent = new Intent(currentContext, TargetActivity.class); currentContext.startActivity(intent);
获取资源
String appName = context.getResources().getString(R.string.app_name); Drawable icon = context.getResources().getDrawable(R.drawable.ic_launcher);
获取系统服务
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
创建对话框
AlertDialog.Builder builder = new AlertDialog.Builder(activityContext);
Activity Context
(如静态变量、单例、线程中引用)。 Application Context
替代 Activity Context
。 Activity Context
。 Context
。错误案例:在工具类中使用 Activity Context
初始化单例。
正确做法:
public class ImageLoader { private static ImageLoader instance; private final Context context; private ImageLoader(Context context) { // 必须使用 Application Context this.context = context.getApplicationContext(); } public static ImageLoader getInstance(Context context) { if (instance == null) { instance = new ImageLoader(context); } return instance; } }
操作 | Activity Context | Application Context | Service Context |
---|---|---|---|
创建时机 | onCreate() 时生成 | Application onCreate() 时生成 | Service onCreate() 时生成 |
销毁时机 | onDestroy() 时销毁 | 应用退后台或被杀时销毁 | Service onDestroy() 时销毁 |
能否长期持有 | 否(易内存泄漏) | 是(推荐全局使用) | 否(需与 Service 生命周期绑定) |
避免在异步任务中直接使用 Activity Context
AsyncTask
、Handler
、Thread
中引用 Activity
,可能导致 Activity
销毁后仍被持有。 WeakReference
或 Application Context
。UI 操作必须用 Activity Context
AlertDialog
、Toast
、LayoutInflater
需要依赖 Activity
的窗口环境。Activity
的 Context
?答:Activity
的生命周期较短(可能随时被销毁),若长期持有其 Context
(如存入静态变量或单例),会导致 Activity
无法被垃圾回收,引发内存泄漏,建议使用 Application Context
或弱引用。
Application
级别的 Context
?答:
Activity
获取: Context appContext = activity.getApplicationContext();
Service
获取: Context appContext = service.getApplicationContext();
MyApp.getInstance()
(需自定义 Application
类并实现单例)。