標籤:cas 關閉 活躍 添加 android中 oid www 區別 cti
轉載: http://www.myexception.cn/android/1968332.html
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()設定的上下文
總結:
1.dialog
dialog依附於activity存在,所以直接用XXXActivity.this就好,當activity消失的時候dialog也就銷毀了
2.activity
上面我們已經說過了,直接使用XXXActivity.this,返回的是當前的activity執行個體,當前activity銷毀時,一起銷毀
3.service,broadcastReceiver
兩者都可以
總結:和UI操作相關的不建議使用getApplicationContext(),一般都使用和activity相關的context,其餘的操作,看具體情況,根據存在的生命週期的長度作出選擇
android中activity.this跟getApplicationContext的區別