Reference:
1,http://guides.codepath.com/android/Using-Context
2,http://blog.csdn.net/qinjuning/article/details/7310620
3,http://www.cnblogs.com/wenjiang/archive/2012/10/15/2724923.html
4,http://blog.csdn.net/yanbober/article/details/45967639
一,什么是Context
It also enables access to Android's built-in services,such as those used for layout inflation, keyboard, and finding content providers.
从Context的定义来看,Context提供以下几个功能:
1 提供访问应用程序状态的信息;
2 提供Acitivities, Fragments,Services 访问 Resource,images,themes/styles 外部目录的接口;
3 提供访问Android内部服务的接口:layout inflation, input 与及 content providers
二, Context的分类:根据生命周期区分
1 Acitivity-Context:该Context随着Activity的销毁而销毁;service-Context的生命周期也是这种。
2 Application-Context:该Context会伴随着整个Application,可以将Application-Context 的生命周期看做是整个应用。
当Activity销毁,Application-Context仍然存在;但是如果Activity中的某些资源文件包括images是与Application-Context相关;
这些资源文件不会因为Activity的销毁而被释放,从而引起了内存泄漏。
三,Application-Context使用: 获取全局的context:getApplicationContext()
参考例子:
public Class myApplication extends Application{
private static Context mContext;
myApplication() { mContext = this; }
public static Context getApplicationContext()
{
return mContext;
}
}
同时需要在AndroidManifest.xml
<application android:name=".exampleApplication"></application>
四: Activity-Context :Acitivity-Context 的生命周期伴随Activity
在一个 Activity 中可以使用 this就可以获取当前 Activity的 Context。
如:
Toast.makeText(this, s, Toast.LENGTH_LONG).show()。
上述的例子this就是当前的Activity-Context。但是如果在匿名内部类使用this,是会出错的。因为内部类中使用this得到的是内部类的对象引用,而不是我们要的外部类。
因此必须使用类名.this这种方式,这种做法在按钮的事件监听中需特别注意。
还有一个小错误:
public class MainActivity extends AppCompatActivity {
public final static String TAG = "richard";
public Button buttonContext;
public Intent intent = new Intent(MainActivity.this, ContextActivity.class);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonContext = (Button) findViewById(R.id.button_context);
buttonContext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "============== button Context clicked ============= ");
//intent = new Intent(MainActivity.this, ContextActivity.class); //要指定MainActivity.this。不能直接使用this
startActivity(intent);
}
});
}
}
提示红色出出现 NULL 指针; 原因是Activity 只有跑了构造函数或者跑到onCreate() 之后, 才会创造Activity-Context 。
五, Context什么时候创建
1 创建Application对象时,而且整个APP共享一个全局的Application Context;
2 创建Activity对象时;
3 创建Service对象时;
所以,总的Context个数 = Service个数 + Activity个数 + 1(Application Context)
六,Context 深入补充:
Context的继承关系图如下:
由继承关系可以看到,Service和Application的类均从ContextWrapper直接继承;Activity则从ContextThemeWrapper继续,这是因为Activity是负责UI界面的显示,需要Theme主题。
七,Context的使用引起的内存泄露:
譬如一个单例模式的自定义数据库管理工具类需要传入一个Context,而这个数据库管理对象又需要在Activity中使用,如果我们传递Activity的Context就可能造成内存泄漏(因为Activity可能已经销毁,但是Context需要被使用,无法释放),所以需要传递Application的Context。