android中activity.this跟getApplicationContext的區別


轉載: 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,其余的操作,看具體情況,根據存在的生命周期的長度作出選擇

如果是UI控件需要使用Activity作為Context對象,但是默認的Toast實際上使用ApplicationContext也可以
實際上,只要把握住一點,凡是跟UI相關的,都應該使用Activity做為Context來處理
可以看到Activity、Service、Application都是Context的子類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM