Android的Context是一个经常用到的概念,由于它是一个抽象类所以更多时候我们见到或使用到的是它的子类,比如getApplicationContext(),getBaseContext(),getContext()。中文一般翻译成“上下文”,结合汉语中对上下文的解释不难理解Android环境中对Context的定义和重要性。Android应用是由一个个组件组成的(各个Activity,Service,View等),想要合理的沟通和运行这些组件就需要Context来作为“桥梁”。这篇文章就来好好总结下Android中Context相关的知识点。
1.概念
首先来看官方对Context的解释:
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
这段话告诉我们这几点信息:
1.Context是应用环境的全局信息接口;
2.Context是抽象类不能直接使用,具体实现交给Android系统;
3.Context用来访问资源和类,启动activity,brocadcast和接受intent等。
下面先好好解释下这3点信息。
1.1 应用全局信息接口
上面提到Context是Android各个组件沟通桥梁,主要就是四大组件+资源。看下面一张图:
Activity类继承了ContextThemeWrapper,而Service继承了ContextWrapper,都间接继承了Context。ContextImpl是Context的具体实现,ContextWrapper是对ContextImpl的进一步包装(利用mBase对象,实际是一个Context对象)。ActivityThread类是Android应用框架的核心对象,它就在ContextImpl类中。有了这些认知我们可以更好的理解官方概念中的“应用全局信息接口”这句话。
1.2 Android系统实现具体Context
Android的具体Context其实有多种,getApplicationContext()方法得到的是一个APP全局的Context,在Fragment中getActivity()方法得到的又是一个Activity类型的Context,View中又通常采用getContext()来获取Context。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Context context0 = getApplicationContext();
Context context1 = getApplication();