2013-02-02 50 views
42

有人能解釋這個給我請:Android的意圖語境混淆

Intent intent = new Intent(Context, AlarmReceiver.class); 

我永遠無法理解,我認真地想,我永遠不會,如果有人不試圖深入這個給我解釋。這整個上下文對我來說很困惑。有時它的工作原理是這樣的:

Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); 

有時它不會像工作,但它僅接受:

Intent intent = new Intent(context, AlarmReceiver.class); 

有時它:

Intent intent = new Intent(this, AlarmReceiver.class); 

等等等等等多項。

我瞭解上下文的基礎知識,但有多少?爲什麼日食會給我一次錯誤而又一次罰款?爲什麼我們有時需要聲明上下文? :

Context context; 

我無法找到適合所有情況的正確環境我怎麼知道在任何情況下哪個是正確的?

回答

56

首先,讓我解釋什麼the context好一些,然後讓我們繼續討論如何使用和接收它。本質上講,上下文是將您的資源鏈接到您的程序的參考。每個對象都有自己的上下文,其中包含設置該對象所需的資源。除了其他目的之外,還需要創建許多對象並獲取程序標識信息。這對建立新的視圖和活動非常重要,但它也可以用於其他目的。有關更多信息,另請參閱this answer

項目的上下文可能來自不同的地方。有時它被存儲並且必須被檢索,有時它被繼承。基本上,這是面向對象編程。

只給你幾個例子:

Activity繼承上下文。因此,如果你在一個活動中,你只需要傳遞自己的使用上下文。它還包含一個指向getBaseContext()的指針。如果您需要整個應用程序上下文,您可能偶爾需要引用該內容,但很可能您暫時不會。

View不會繼承上下文。但是,它確實有一個方法getContext()。如果你需要從視圖中獲取上下文,這是獲取它的方法。此上下文不會完整,但只會包含View的內容的上下文。

Fragments也不會繼承上下文。它們包含一個方法getActivity(),如果片段處於活動狀態,將返回活動,這是片段的上下文。

BroadcastReceivers也不繼承上下文。事實上,他們根本不包含上下文,只是在接收到事件時接收當前上下文(如onReceive(Context context, Intent intent)

+1

那麼BroadcastReceiver類的方法呢?需要什麼樣的背景,我找不到合適的背景? – user1880779

+1

好的,我已經添加了一個以及我的答案。 – PearsonArtPhoto

+0

謝謝回答,還好我有我的廣播接收器類中的方法,該方法我想:'意向意圖=新意圖(,AlarmReceiver.class);',找不到正確的上下文 – user1880779

5

我通過上下文的方式瞭解的是環境。簡單地說,上下文是任何事物的環境。因此,當你使用任何形式的上下文時,你必須決定你正在使用上下文的事物的周圍環境。

例如,如果你想要一些數據或現場維持通過了,你應該在應用程序類定義它的應用程序。

現在,當你在你的任何應用程序的組件的應用程序上下文,此字段中,在應用程序類已宣佈將在你的context.Hence您可以訪問它。

對於所有上下文類型也是如此。

如果你曾嘗試在服務組件中使用alertDialog,使用上下文「this」。試試這個,我敢打賭你肯定會得到異常,因爲「this」代表服務的環境,當它用在它背景中時,我們不能添加窗口。因此它會告訴你這個壞的標記異常。這意味着爲周圍的視圖生成的標記不適合alertDialog顯示。

希望這給你想要的東西簡單的想法。

4

上下文能力

您可以安全地與給定的上下文對象採取共同行動取決於它從最初來。以下是常見的地方的應用程序將收到一個上下文表,並在每種情況下什麼它是有用的:

enter image description here

  1. 應用程序可以從這裏開始的活動,但它需要一個新的任務被創建。這可能適合特定的用例,但可以在應用程序中創建非標準的後退堆棧行爲,通常不被推薦或被認爲是良好的做法。
  2. 這是合法的,但通貨膨脹率將與在其上運行的系統,沒有什麼在你的應用程序中定義的默認主題來完成。
  3. 在Android 4.2及以上版本中,如果接收方爲空(用於獲取粘性廣播的當前值),則允許使用。

原創文章here