2011-10-13 57 views

回答

31

Intent只要這些組件正在運行,對象將永久地附加到ActivityService和其他組件。他們不會因爲你離開另一個應用程序而離開。其原因是因爲Android可能會隨時終止進程,但用戶可能仍然想回去繼續他們正在做的事情。這使Intents成爲存儲或傳輸小型(有時甚至是大量)信息的理想之選,通過Extras。

onNewIntent()方法專門用於處理更持久的應用程序組件,因此可能會在其LifeCycle期間多次調用它,但需要跟蹤它被調用的原因(以及因此調用的數據) 。無論您是否撥打setIntent()取決於您需要做什麼。

如果您不在乎它爲什麼被隨後調用,您可以通過不致電setIntent()保留原始Intent。當你的Activity(或其他組件)執行相同的事情時,無論是誰調用它以及它提供了什麼數據,這都是特別有用的。

如果您有需要分別回覆每個事件,那麼您必須至少存儲新的Intent的信息。這意味着您可以避開setIntent(),但是,除非您直接將它們發送給它們,否則它鏈接到的任何組件都不會有任何Intent信息。對於不能保證原始的Intent被完全處理的應用程序,這可能是期望的行爲。

如果您需要分別回覆每個意向並且原始Intent沒有關係,那麼您使用setIntent()。這丟棄原來的Intent,它仍然在那裏...並放置新的Intent,以便如果用戶離開(又一次),他們會回到同一個地方。

super.onNewIntent()不處理這個問題的原因是因爲核心組件類不能確定新的Intent比舊的更重要。它所關心的是它Intent,而不是它是什麼。這就是爲什麼我們重寫這些方法的原因,所以我們確定什麼是重要的,什麼不重要。一般的感覺是像Activity這樣的基類可以以任何方式使用我們擁有的任何數據(除非我們重寫並另外說明)。但是,除非我們特別告訴他們,否則他們不應(也往往不能)擺脫我們的數據。 這是你真的不想和一些程序員在一起的觀點。呵呵

希望這會有所幫助。

+0

我真的很感激這個答案。現在我的目的非常明確。乾杯! – w3bshark

2

爲onNewIntent狀態的文檔:「請注意,getIntent()仍返回原意您可以使用setIntent(意向)將其更新到這個新的意圖。」我的猜測是onNewIntent存在,這樣你的活動可以被通知,超級可能什麼也不做。

1

我剛從我的onNewIntent(Intent intent)實現中刪除了setIntent(intent)代碼。

原因: 我的主動性是單頂。當我的應用程序運行時,它會啓動其他活動,如相機活動。當應用程序返回到MainActivity時,onResume()getIntent()返回的(最後一個)意圖將被重新處理,即使它已經被處理過。

我的新實現(到目前爲止工作): 將意圖從onNewIntent(Intent intent)存儲在私有實例字段中。在onResume中檢查此字段是否爲空,並立即將其重置爲空,只處理一次意圖一次。

另請參見https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY

相關問題