活動繼承上下文。 AlertDialog.Builder指定了一個Context參數,因爲它可以被上下文的任何一個類使用,包括一個Activity,ListActivity,Service,...(這裏有一個常見的編碼習慣 - 你可以瞭解更多關於它的知識通過閱讀Joshua Bloch的奇妙Effective Java中的Item I8(關於Interfaces和Abstract類)。
getApplicationContext()返回您的應用程序的上下文,這與您的活動上下文大體相同 - 而「大部分」是將您拋棄的內容。細節不清楚,但這是一個廣泛遇到的問題,典型的答案是使用將寫入警報到屏幕的上下文。請注意,這是而不是 getApplicationContext()返回的那個。
現在,如果你像我一樣,你可能會說「但是我在一個不能從Activity繼承的類中工作 - 這就是爲什麼我想首先使用getApplicationContext()來達到這個目的的原因 - 呃!我實際上不會那麼粗魯地說話; p ..關鍵是我也來過這裏。我修正了這樣的問題:1)問問自己:「我是否在非活動類中使用了UI AlertDialog代碼,因爲我想跨活動......或者甚至是跨ListActivities,Services ......分享它。如果沒有,嗯......你真的有代碼中的AlertDialog UI調用,你不能保證有權訪問UI(以及上下文)嗎?如果是這樣,請重新考慮您的設計。
假設你確實希望跨活動分享這個課程,答案就變得清晰了。您希望您的類由各種呼叫者是可用的,每個大概有它自己的上下文:所以調用者必須通過它的上下文到您的類作爲參數:
myClass(Context theContext, ...) { ... }
每一項活動,服務等。然後使得像這樣的呼叫:
myClass(this, ...);
眼熟?
請注意!如果您要共享代碼,則必須考慮到並行調用不同調用的可能性,以及所有的後果。這超出了我們的範圍......
玩得開心:)
來源
2011-03-29 00:29:24
DJC
其他對話框也是如此。好問題,+1 – bigstones 2011-03-25 19:10:37
@bigstones我發現了另一個線程處理類似的問題,但沒有解釋:http://stackoverflow.com/questions/3968170/android-prompt-users-input-using-a-dialog – an00b 2011-03-25 19:40:52
我的猜測是Builder並不只是要求一個Activity,因爲它會阻止未來的API有其他類型的可以顯示對話的上下文。 – bigstones 2011-03-25 20:21:05