編輯:Android開發教程
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。
比如我們寫了一個應用程序,它需要加載一個很大的圖片,我們不希望每次旋轉屏幕的時候都銷毀這個圖片重新加載。
實現這個要求的簡單想法就是定義一個靜態的Drawable,這樣Activity 類創建銷毀它始終保存在內存中。
ActivityUnitTestCase 通常用來測試單獨Activity。在啟動被測試的Activity之前,你可以Inject一個假的Context或是 Applic
隨著大屏手機、Pad等移動設備成為標配,手機看視頻已經成為多數人的選擇,但對於愛折騰一族來說,這還遠遠不夠。3月25日,喜歡給用戶制造驚喜的搜狗手機浏覽器推出了最新的An
Android和iOS誰更強?看到這個問題兩大陣營的用戶們估計又要吵翻天了。但誰都不能否認的是,這兩款操作系統都具備著超強的實力,才能夠取得如今的成績。在最近,Andro
Android允許從已有的視圖工具箱(Widget Tool Box)派生子類 或 實現自己的視圖控件;通過重寫事件處理程序 和onDraw()方法, 但是仍然回調超類(