TShopping

標題: android中activity.this和getApplicationContext的區別 [打印本頁]

作者: woff    時間: 2017-10-18 17:24
標題: android中activity.this和getApplicationContext的區別
在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設置的上下文


文章出處





歡迎光臨 TShopping (http://www.tshopping.com.tw/) Powered by Discuz! X3.2