android基础教程之context使用详解

2019-12-10 20:08:34王旭
Android中context可以作很多操作,但是最主要的功能是加载和访问资源,下面详解了解一下它的使用方法    

在android中有两种context,一种是application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。

区别联系:

 

复制代码
public class MyActivity extends Activity {
    public void method() {
       mContext = this;    // since Activity extends Context
       mContext = getApplicationContext();
       mContext = getBaseContext();
    }
 }

 

this 是Activity 的实例,扩展了Context,其生命周期是Activity 创建到销毁
getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁
Activity.this的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁
getBaseContext() 返回由构造函数指定或setBaseContext()设置的上下文,SDK文档很少,不推荐使用
搞清楚了生命周期就会在使用过程中犯错误,比如有一个全局的数据操作类用到了context,这个时候就要用到getApplicationContext 而不是用ACtivity,这就保证了数据库的操作与activity无关(不会一直引用Activity的资源,防止内存泄漏)

应用场景:
比如一个activity的onCreate:

 

复制代码
protected void onCreate(Bundle state) {        
     super.onCreate(state);        
     TextView label = new TextView(this); //传递context给view control        
     label.setText("Leaks are bad");        
     setContentView(label);
}

 

把activity context传递给view,意味着view拥有一个指向activity的引用,进而引用activity占有的资源:view hierachy, resource等。
这样如果context发生内存泄露的话,就会泄露很多内存。这里泄露的意思是gc没有办法回收activity的内存。

Leaking an entire activity是很容易的一件事。当屏幕旋转的时候,系统会销毁当前的activity,保存状态信息,再创建一个新的activity。