检测应用程序何时启动或从最近的应用程序打开

Detect when app just started or opened from Recent Apps

我正在开发一个 Android 应用程序,我想在打开时模拟官方 Google Plus 应用程序的相同行为,即:

我的应用程序有一个 activity 使用导航抽屉和几个片段作为页面。我的目标是保留当前片段并在应用程序从最近的应用程序恢复时显示它。我可以使用 SharedPreferences 通过存储当前片段的标签并在用户重新打开应用程序时加载它来设法做到这一点。解决方案的问题是此类数据是持久性的,因此即使用户首先从“最近的应用程序”列表中删除应用程序并重新打开它,用户也总是会看到最后一页。

那么如何检测该应用程序是否已经在最近的应用程序列表中?或者是否有任何方法在从该列表中删除应用程序时调用,以便我可以清除 SharedPreferences 中的最后一个片段标记?还是我使用了错误的方法?

感谢您的耐心阅读。

当您通过最近任务列表return进入您的应用程序时,有三种可能性:

  1. 好久了,30多分钟了,你的流程不运行。在这种情况下,Android 就像用户点击主屏幕启动器图标一样启动您的应用程序。你没有得到你保存的实例状态,因为它被认为是陈旧的。

  2. 时间不长,因此Android希望用户认为您的应用自从他们离开后一直运行。但是,由于内存压力,Android 在您的进程处于后台时终止了它。在这种情况下,Android 为您分叉一个新进程,创建您的 activity 的一个实例,并在 onCreate() 和 [=12] 中将保存的实例状态 Bundle 传递给您=].

  3. 您的进程已经 运行。在这种情况下,您的 activity 将返回前台。您不需要您的实例状态,因为您的 activity 实例仍然是 运行。 Android 没有触及你的小部件,所以如果你的 UI 不是你想要的样子,那是你自己的错,因为你做了一些事情(例如,在 onPause()onStop()) 搞砸了你的 UI。根据你的描述,我的解释是你正在测试这个场景,在这种情况下 onRestoreInstanceState() 没有被调用,因为它不需要。

因此,只要您不搞砸自己的 UI,您的应用程序就会像您为 Google 描述的那样工作 另外,只要您处理场景的已保存实例状态#2 以上。

在 Android 5.0+ 上,有相关的场景绑定到 PersistableBundle 中,您可以将它们与 onSaveInstanceState() 和 kin 的变体一起使用。我没有玩过 PersistableBundle,所以我没有任何与之相关的特别建议。

事实证明,我提到的行为是自动的,我的项目有一个问题阻止了它:这是我的 AndroidManifest.xml

中的 activity
<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需要设置false:

A value of "true" means that the activity will not leave a historical trace. It will not remain in the activity stack for the task, so the user will not be able to return to it. - Documentation