2

我開發一個Android應用程序,我想效仿谷歌官方應用加的相同的行爲在打開時打開,裏面是:檢測程序時,剛開始還是從最近訪問的應用

  • 如果該應用程序仍處於最近的應用程序列表中,並且您打開它(從圖標或最近的應用程序,這沒關係),您將從您離開的位置恢復應用程序。
  • 如果應用程序不再位於最近的應用程序列表中,並且您打開它,您將看到一個啓動畫面,然後轉到主頁。

我的應用程序有一個使用導航抽屜和幾個片段作爲頁面的活動。我的目標是保留當前片段,並在應用程序從最近的應用程序恢復時顯示它。我可以設法使用SharedPreferences,通過存儲當前片段的標籤並在用戶重新打開應用程序時加載它。問題是解決方案是這種數據是持久的,因此即使用戶首先將應用程序從最近的應用程序列表中刪除並重新打開,用戶也會始終接到最後一頁。

那麼如何檢測應用程序是否已經在最近的應用程序列表中?或者是否有任何方法在從該列表中刪除應用程序時調用,以便我可以清除SharedPreferences中的最後一個片段標記?或者我使用了錯誤的方法?

感謝您耐心閱讀本文。

+3

您看到的行爲是自動的,假設用戶在短時間內(〜30分鐘)內返回應用程序。不過,您需要將狀態保存在已保存的實例狀態「Bundle」中。請注意,除非手動刪除,否則在Android 5.0及更高版本中,應用程序始終處於總覽屏幕(最近的應用程序列表)中。 – CommonsWare

+0

@CommonsWare感謝您的回覆。我現在使用'onSaveInstanceState'並使用日誌我發現它切換到另一個應用程序時實際被調用。我現在面臨的問題是,當我重新打開應用程序時不會觸發'onRestoreInstanceState',因此數據不會被恢復。我也在'onCreate'中做了一個檢查,看看bundle是否爲null。但是,當我傾斜設備並保持正確的碎片時,它確實有效。 –

+0

「我現在面臨的問題是,當我重新打開應用程序以使數據未恢復時,未觸發onRestoreInstanceState」 - 請詳細解釋如何對此進行測試。請注意,在按HOME的情況下,如果您的進程仍在運行,那麼通過最近的任務列表返回到應用程序,將在您的活動中調用的唯一與生命週期相關的方法是onStart()和onResume ()'。您不需要實例狀態,因爲您的活動仍然存在。 – CommonsWare

回答

2

當您返回到通過最近的任務列表中的應用程序,有三種可能性:

  1. 它已經很長一段時間,超過30分鐘,你的進程沒有運行。在這種情況下,Android只是啓動您的應用程序,就好像用戶點擊您的主屏幕啓動器圖標。你沒有被賦予你保存的實例狀態,因爲它被認爲是陳舊的。

  2. 它已經很長時間了,所以Android希望用戶認爲你的應用程序在他們離開後一直在運行。但是,由於內存壓力,Android終止了它在後臺的進程。在這種情況下,Android會爲您分配一個新流程,創建您的活動實例,並將和onRestoreInstanceState()中保存的實例狀態Bundle傳遞給您。

  3. 您的進程已經在運行。在這種情況下,您的活動只會回到前臺。您不需要實例狀態,因爲您的活動實例仍在運行。 Android沒有觸及你的小部件,所以如果你的UI不符合你的想法,那是你自己的錯,因爲你做了一些事情(例如,在onPause()onStop())搞砸了你的UI。根據您的描述,我正在解釋您正在測試此場景,在這種情況下onRestoreInstanceState()未被調用,因爲它不是必需的。

所以,只要你不要搞砸了自己的UI,應用程序會像你描述它谷歌加工作,只要你辦理上述場景#2所保存的實例狀態。

在Android 5.0+上,有相關的場景與PersistableBundle相關,您可以使用onSaveInstanceState()和親屬的變體。我還沒有玩過PersistableBundle,所以我沒有任何特別的建議。

+0

我檢查了我處理碎片的方式,結果證明你是正確的,我做錯了!你的解釋非常清楚和完整,謝謝。 –

2

事實證明,我提到的行爲是自動的,有我的項目,防止它的一個問題:這是活動在我AndroidManifest.xml

<activity android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:noHistory="true"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

android:noHistory需要設置

值「true」表示該活動不會留下歷史追蹤。它不會留在任務的活動堆棧中,所以用戶將無法返回到它。 - Documentation

相關問題