Android Context详解:场景、继承与应用初始化

1 下载量 168 浏览量 更新于2024-08-28 收藏 124KB PDF 举报
在Android开发中,Context是一个至关重要的概念,它代表了应用程序运行时的上下文环境。本文将从以下几个方面深入探讨Context: 1. **Context的认知**: Context在Android中可以理解为编程中的“场景”,它反映了应用程序中的不同功能或状态。例如,Activity对应的是用户界面的一个实例,如编码场景、打电话场景或开会场景,每个Activity或Service都可视为Context的一种表现形式。Context抽象地封装了应用程序的资源访问权限、生命周期管理和与系统交互的能力。 2. **Context的继承关系**: - **Activity与Context的关系**:Activity是Context的主要类型之一,它直接继承自Context,并且扩展了其他接口。在语法上,`Activity extends Context`,这意味着Activity具有Context的基本功能,同时提供了额外的UI管理、事件处理等功能。服务(Service)也作为Context的子类,同样继承了Context的特性,用于执行后台任务。 - **Context的抽象性**:由于Context包含了所有场景元素,它被设计为抽象类,使得Activity和Service能够根据需求扩展其功能,而不必关心底层实现的细节。 3. **Context的继承关系图**: 这部分通常会展示一个详细的类层次结构图,展示了Activity、Service、Context以及其他相关类(如ApplicationContext、ContentResolver等)之间的继承关系,帮助开发者理解它们之间的层次联系和职责划分。 4. **Application对象的ContextImpl创建过程**: 在Android启动过程中,Application对象的ContextImpl是在ActivityThread的内部类ApplicationThread中创建的。这个过程涉及多个步骤: - Ams(ActivityManagerService)通过远程Binder通信,调用`bindApplication()`方法,传入ApplicationInfo对象,包含应用的基本配置和元数据。 - ApplicationInfo和provider信息等参数会被传递给ActivityThread,用于初始化和配置应用。 - 启动模式、调试选项、限制备份模式等设置也会在这个阶段被处理。 - 最后,ContextImpl对象会被创建并返回,供后续应用组件使用。 了解Context的这些方面,开发者可以更有效地利用Context进行资源访问、权限控制、广播接收、以及与其他组件和服务的通信,从而构建出功能丰富的Android应用。在实际开发中,合理利用Context是实现高效、稳定和安全应用的关键。
2012-10-08 上传
大家好,今天给大家分享一下Android里的Context的一些用法. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml文件里其实是默认的 为了让大家更容易理解,写了一个简单的Demo.步骤如下: 第1步:新建一个Android工程ApplicationDemo,目录结构如下: 第2步:新建一个工具类ToolsUtil.java,代码如下 package com.tutor.application; import android.content.Context; import android.widget.Toast; /** * @author carlshen. * 应用的一些工具类. */ public class ToolUtils { /** * 参数带Context. * @param context * @param msg */ public static void showToast(Context context,String msg){ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } /** * 调用全局的Context. * @param msg */ public static void showToast(String msg){ Toast.makeText(MainApplication.getContext(), msg, Toast.LENGTH_SHORT).show(); } } 第3步:新建一个View命名为MainView.java就是我们Activity现实的View.代码如下: package com.tutor.application; import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.FrameLayout; /** * @author carlshen. * 自定义的MainView. */ public class MainView extends FrameLayout implements View.OnClickListener{ private Context mContext; private Activity mActivity; /** * 参数Button. */ private Button mArgButton; /** * 全局Button. */ private Button mGlobleButton; /** * 退出Button. */ private Button mExitButton; public MainView(Context context){ super(context); setupViews(); } public MainView(Context context, AttributeSet attrs) { super(context, attrs); setupViews(); } private void setupViews(){ //获取View的上下文. mContext = getContext(); //这里将Context转换为Activity. mActivity = (Activity)mContext; LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.main, null); addView(v); mArgButton = (Button)v.findViewById(R.id.arg_button); mGlobleButton = (Button)v.findViewById(R.id.glo_button); mExitButton = (Button)v.findViewById(R.id.exit_button); mArgButton.setOnClickListener(this); mGlobleButton.setOnClickListener(this); mExitButton.setOnClickListener(this); } public void onClick(View v) { if(v == mArgButton){ ToolUtils.showToast(mContext, "我是通过传递Context参数显示的!"); }else if(v == mGlobleButton){ ToolUtils.showToast("我是通过全局Context显示的!"); }else{ mActivity.finish(); } } } 这里MainView.java使用的布局main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> 第4步:修改ApplicationDemoActivity.java,代码如下: package com.tutor.application; import android.app.Activity; import android.os.Bundle; public class ApplicationDemoActivity extends Activity { private static Context aContext; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainView mMainView = new MainView(this); setContentView(mMainView); aContext = getApplicationContext(); } /**获取Context. * @return */ public static Context getContext(){ return aContext; } } 第5步:运行上述工程效果如下:
2024-11-29 上传