在android中常常會遇到與context有關的內容 淺論一下context : 在語句 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求傳遞的 參數就是一個context, 在這裡我們傳入的是this,那麼這個this究竟指的是什麼東東呢? 這裡的this指的是Activity.this,是這個語句所在的Activity的this,是這個Activity 的上下文。 網上有很多朋友在這裡傳入this.getApplicationContext,這是不對的。 AlertDialog對象是依賴於一個View的,而View是和一個Activity對應的。 於是,這裡涉及到一個生命周期的問題,this.getApplicationContext取的是這個應 用程序的Context, Activity.this取的是這個Activity的Context,這兩者的生命周期是不同 的,前者的生命周期是整個應用, 後者的生命周期只是它所在的Activity。而AlertDialog應 該是屬於一個Activity的, 在Activity銷毀的時候它也就銷毀了,不會再存在;但是,如果傳 入this.getApplicationContext, 就表示它的生命周期是整個應用程式,這顯然超過了它 的生命周期了,而且不能判定這個dialog屬於哪一個activity(AlertDialog屬於Activity的一部分), 所以程序會報錯,"anndroid.view.WindowManager$BadTokenException:unable to add window - -token null is not for an application"提示不能添加窗口。 所以,在這裡我們只能使用Activity的this。
下面介紹一下兩者的區別 (1)對於getApplicationContext,我們可以假定它是一個父類,它屬於整個應用程式共有,Activity.this可以假定為其的一個子類,該子類包含了一些特定的引用。所以,一般可以用getApplicationContext的地方都可以用特定的Activity.this代替。 (2)在生命周期上,通過getApplicationContext得到的上下文對象們只要當前的應用程式還存在,那麼該對象就會一直存在,對於Activity.this上下文來說,只要當前的activity執行了onDestory方法,這個上下文對象就會一起被系統收回。 (3)在應用場景上,如果我們通過一個上下文對象來執行某個動作,且希望一直處於活躍狀態,那麼應該用getApplicationContext來獲取上下文,如資料庫的操作。此時,如果採用Activity.this,那麼當前Activity調用onDestory方法時,資料庫就會關閉,應用程式會產生錯誤。
getApplicationContext 返回應用的上下文,生命周期是整個應用,應用摧毀它才摧毀
Activity.this的context 返回當前activity的上下文,屬於activity ,activity 摧毀他就摧毀 getBaseContext 返回由構造函數指定或setBaseContext設置的上下文
文章出處
|