TShopping

 找回密碼
 註冊
搜索
查看: 1262|回復: 0

[教學] android中activity.this和getApplicationContext的區別

[複製鏈接]
發表於 2017-10-18 17:24:54 | 顯示全部樓層 |閱讀模式
 
Push to Facebook
在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設置的上下文


文章出處

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-3-29 16:14 , Processed in 0.074620 second(s), 23 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表