2016-12-04 111 views
3

儘管具有不同的活動工作,並開始他們的結果我沒有選擇,只能使用意圖。現在意圖需要上下文,這對我來說毫無意義。我知道這種情況下允許訪問的應用程序資源,但爲什麼意圖需要上下文?

爲什麼你需要了解應用程序資源時的意圖僅僅是一個簡單的使者?

另外,我不太確定爲什麼有些人創建與getApplicationContext()而其他使用此爲活動場景意圖????

最後,我不確定在調用startActivityResult()的活動時,如果我不通過上下文的「this」而是應用程序上下文,方法onActivityResult()上的回調會得到回調。我認爲你必須使用「this」或在當前活動環境中傳遞startActivityResult()以獲得回叫。這只是直接了當的Java吧?如果你在一個類中,然後通過其他活動類將有你的類的引用,從而允許它來調用你的類,這是onActivityForResult()的方法。但是,情況並非如此,所以我錯過了什麼?

回答

4

Intent本身並不需要Context。構造函數Intent#Intent(Context, Class)只是一個方便的構造方法,它在內部使用提供的參數來派生ComponentNameComponentName反過來只是您的應用的包名稱和目標類名。所以ComponentName可能是這樣的:

com.foo.bar/com.foo.bar.ui.activity.MyActivity 

但是,您可以也只是用一個空的構造Intent#Intent()並提供ComponentName自己(Intent#setComponentName(ComponentName))。

因此,如果您提供應用程序或您的活動的上下文(後者只是輸入更簡單),則無關緊要。同時請記住,需要應用程序上下文的類可以自己調用Context#getApplicationContext,所以這不是您需要擔心的問題。

關於startActivityForResult() - Android在內部管理您的活動記錄堆棧。因此它將結果傳遞給堆棧中的前一個活動。當您點擊「返回」時,它也知道返回的位置。

請注意,這並不意味着它會維護一堆活動實例。這些實例可能早已消失 - 被摧毀和垃圾收集以釋放內存。但是,堆棧包含允許重新創建它們並恢復其狀態的信息。

+0

您好,您的回答非常簡潔明瞭。不過,我只想快速澄清一下。所以,無論何時我開始一個活動,調用startActivity()的活動都將在堆棧中正確註冊?那麼,如果我沒有特別通過該活動,那麼android如何知道引用該活動並將其註冊到堆棧中。 – Wowzer

+0

系統知道哪個活動位於堆棧頂部(您的活動)。當你開始一個新的時候,它使用一個組件名來標識它。即使您使用隱式意圖(其中一個使用操作而不是明確的目標名稱),它最終也會解析爲特定的組件名稱。 –

0

沒有受到太大深入到Android開發但還是讓我試着解釋。所以基本上,上下文是將您的資源鏈接到您的程序的參考。每個對象都有自己的上下文,其中包含設置該對象所需的資源。除了其他目的之外,還需要創建許多對象並獲取程序標識信息。這對建立新的視圖和活動非常重要,但它也可以用於其他目的。有關更多信息,請參閱此Android Context。按照 Activity inherits context。因此,如果你在一個活動中,你只需要傳遞自己的使用上下文。它還包含一個指向getBaseContext()的指針。如果您需要整個應用程序上下文,您可能偶爾需要引用該內容,但很可能您暫時不會。

有些方法可以創建一個不需要上下文的Intent。但是,如果您想要定位特定包的特定類別,那麼爲目標包提供上下文是現成的方法。請參閱此Context Lesson

正如他在answergetApplicationContext() offers application context中的snctin所解釋的那樣。基本上,應用程序上下文與應用程序相關聯,並且在應用程序的整個生命週期中始終保持不變。另請參閱this post

Android - How to start (display) a new Activity。根據它

startActivity(new Intent(this, ProjectsActivity.class));

假定當前類擴展了Android活動類之一,它給你訪問到startActivity方法。根據Getting result from a activity,啓動另一個活動不必是單向的。您也可以開始另一項活動並返回結果。要接收結果,請調用startActivityForResult()(而不是startActivity())。

例如,您的應用程序可以啓動相機應用程序並接收拍攝的照片。或者,您可能會啓動People應用以便用戶選擇聯繫人,並且您將收到聯繫詳細信息。這post將幫助你瞭解更好的方式。

希望有所幫助。同時也感謝因爲你的問題,我用Android進行了刷新。:)

0

Intent本身並不需要Context,但正如你自己指出的那樣,Intent只是一個信使。它還將應用程序/對象的當前狀態傳遞給新創建的對象,以便它可以理解應用程序中究竟發生了什麼。這就是爲什麼我們需要通過上下文。

而且,我相信你想詢問關於startActivityForResult()。 Android本身就像處理其他回調一樣處理回調。您可以參考活動生命週期的示例。每當它開始onCreate(), onStart(), onResume()都由Android自己調用。

+0

我不認爲上下文用於理解應用程序中發生了什麼,因爲當您啓動新的活動時,android只會將該上下文默認設置爲該新活動,因爲所有活動都從提供的相同應用程序上下文繼承該活動在應用程序內 – Wowzer

+0

Android不會將自己的應用程序上下文賦予新的活動。使用getAplicationContext()和使用它有一個區別b/w。 Android將提供上下文,無論您將聲明它給。參考問題1026973 – hittsss