2011-03-15 30 views
9

現在我已經研究了這個問題,我正在重寫這個以使其更清晰。如果您正在尋找更多信息,則可以在舊編輯中找到一些信息。從另一個應用程序啓動時,應用程序將失去記憶它的堆棧的能力

正在發生的事情:

(這指的是沒有設置任何launchMode 設置的應用程序,所以使用默認值)

  1. 你是從市場還是從啓動應用安裝程序。這 啓動該應用程序的根/主要活動與 FLAG_ACTIVITY_NEW_TASK標誌並且沒有類別。眼下 應用堆棧[A]

  2. 這樣就可以進行應用程序中的下一個活動。現在 堆在這項任務是[A> B]

  3. 然後你按home鍵,然後從任一主屏幕或應用程序托盤按下它的圖標重新啓動相同的應用程序 。

  4. 在這一點上的預期是活動B將顯示,因爲 這是你離開的地方。但顯示A並且任務堆棧爲 [A> B> A]使用以下標誌以 啓動A的第二個實例:FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_RESET_IF_NEEDED和FLAG_ACTIVITY_BROUGHT_TO_FRONT。它 也有android.intent.category.LAUNCHER類別。

在這一點上,如果你打的返回鍵,它會返回到B,因爲它 是,當你離開它。

查看文檔,看起來好像 FLAG_ACTIVITY_BROUGHT_TO_FRONT只應針對 使用singleTask或singleTop launchModes的活動設置。但是,這個 應用程序尚未設置任何啓動模式,因此使用默認標準launchMode 。

我認爲這不是在這種情況下發生?

我還應該注意到,一旦進入這個奇怪的狀態,每當應用程序從主屏幕或應用程序托盤啓動時,它都會發生。如果任務完成(重新啓動 電話,強制停止應用程序或完全通過 堆棧)會解決此問題,並且不會再正確啓動它。 只有從安裝程序或市場啓動應用程序,然後嘗試從啓動器啓動應用程序時纔會發生。

總之,爲什麼會發生這種情況?有沒有辦法阻止它?

+2

你非常謹慎!同樣的事情發生在我的應用程序中,我真的不知道該怎麼辦!特別是因爲當我從Eclipse內安裝apk時,它工作正常。 – 2011-11-28 16:58:18

+0

[從Android應用程序安裝程序和主屏幕啓動應用程序時的活動堆棧排序問題可能存在重複](http://stackoverflow.com/questions/6356467/activity-stack-ordering-problem-when-launching-application-from- android-app-inst) – blahdiblah 2014-05-19 21:41:30

回答

-1

覆蓋onConfigurationChanged()應該可以幫助你保持狀態。

http://developer.android.com/reference/android/app/Activity.html

配置更改

如果設備的(如由類Resources.Configuration定義)的變化的結構中,然後任何顯示用戶界面將需要更新以匹配的配置。由於Activity是與用戶交互的主要機制,因此它包含對處理配置更改的特殊支持。

除非您另行指定,否則配置更改(例如屏幕方向,語言,輸入設備等的更改)將導致您的當前活動被銷燬,通過onPause()的正常活動生命週期過程,onStop ()和onDestroy()。如果活動處於前臺或對用戶可見,則在該實例中調用onDestroy()後,將創建一個活動的新實例,其中前一個實例從onSaveInstanceState(Bundle)生成的任何savedInstanceState都會創建。

這樣做是因爲任何應用程序資源(包括佈局文件)都可以根據任何配置值進行更改。因此,處理配置更改的唯一安全方法是重新檢索所有資源,包括佈局,可繪製和字符串。因爲活動必須已經知道如何保存其狀態並從該狀態重新創建自己,所以這是通過新配置使活動自行重新啓動的便捷方式。

在某些特殊情況下,您可能希望根據一種或多種類型的配置更改繞過重新啓動活動。這是通過清單中的android:configChanges屬性完成的。對於任何類型的配置更改,如果您在那裏處理,則會接到對當前活動的onConfigurationChanged(配置)方法的調用,而不是重新啓動。如果配置更改涉及到任何你不處理,不過,活動還是會重新啓動並onConfigurationChanged(配置)將不會被調用。」

+0

感謝您的迴應。實際上,我已經在爲我所有的活動重寫configurationChanges,但我認爲這不適用於這個問題。以前的活動永遠不會再被調用,調用直接進入根活動A. – cottonBallPaws 2011-03-15 23:03:27

+0

@littleFluffyKitty我有一個類似的問題,我使用單例類對象來存儲對象的最後一個活動 – GSree 2011-03-16 02:15:37

+0

但是,那麼你不會失去自保存實例狀態值以來的活動狀態將被清除? – cottonBallPaws 2011-03-16 03:07:02

3

這裏是一個解決辦法我想出了這麼遠。一些我已經看到了其他的解決方法,包括查看當前正在運行的任務。但是,我真的不想再向用戶請求另一個權限(GET_TASKS),只是爲了解決問題。

請讓我知道,如果您看到這裏有任何漏洞

在主/根活動的onCreate方法中,檢查意圖是否有 t他設置了FLAG_ACTIVITY_BROUGHT_TO_FRONT,如果是,則調用finish()。然後這個 彈出堆棧A的額外實例[A> B> A]變爲 [A> B],並且從用戶的角度來看,它會啓動他們期望的 活動。

它似乎可以在我所有的測試中工作到目前爲止。我唯一擔心的是,如果 有一些奇怪的情況,某人啓動程序會始終用FLAG_ACTIVITY_BROUGHT_TO_FRONT標記 啓動,即使應用程序不是 已經在任務中,因此會完全鎖定它們,因爲它會調用finish( )並且沒有任何東西在堆棧中以 返回。

-

如這裏的意見中的要求是,你如何檢查是否有意向的特定標誌:

int flags = intent.getFlags(); 
boolean hasFlag = flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT == Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT; 

-

而且我要指出,我仍然看到此問題有時會發生此問題。它似乎不是一個完美的解決方案。

+0

方向更改時應用程序的行爲是否正確? – GSree 2011-03-17 03:26:34

+0

@GSree,是的,因爲我正在處理配置更改。我不確定如果將其關閉,會發生什麼情況。雖然,我認爲它會沒事的。這個問題似乎與它如何啓動有關。 – cottonBallPaws 2011-03-17 08:00:51

+0

如何針對某些標誌測試意圖?即你怎麼知道Intent是用FLAG_ACTIVITY_BROUGHT_TO_FRONT調用的? – 2011-11-28 17:15:18

相關問題