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

时间:2016-04-29 19:37:44

标签: android android-fragments android-activity android-lifecycle

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

  • 如果应用仍然在最近的应用列表中并且您打开它(从图标或最近的应用程序,它并不重要),您将从您离开的地方恢复应用程序。
  • 如果该应用不再位于“最近的应用”列表中并且您打开它,则会出现一个启动画面,然后将其定向到主页。

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

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

感谢您耐心阅读本文。

2 个答案:

答案 0 :(得分:2)

当您通过最近任务列表返回应用时,有三种可能性:

  1. 已经很长时间,超过30分钟,而且您的流程没有运行。在这种情况下,Android只会启动您的应用,就好像用户点按了主屏幕启动器图标一样。您没有获得保存的实例状态,因为它被认为是陈旧的。

  2. 已经有很长一段时间了,所以Android希望用户认为自从他们离开后,您的应用就一直在运行。但是,由于内存压力,Android会在后台终止您的进程。在这种情况下,Android会为您分配一个新流程,创建您的活动实例,并在BundleonCreate()中将您保存的实例状态onRestoreInstanceState()传递给您。

    < / LI>
  3. 您的进程已在运行。在这种情况下,您的活动只会被带回前台。您不需要实例状态,因为您的活动实例仍在运行。 Android没有触及你的小部件,所以如果你的UI不是你想要的那样,那就是你自己的错,因为你做了一些事情(例如,在onPause()onStop()中)搞砸了你的用户界面。从您的描述中,我正在解释您正在测试此场景,在这种情况下,onRestoreInstanceState()未被调用,因为它不是必需的。

  4. 因此,只要您没有搞砸自己的用户界面,只要您处理上述方案#2的已保存实例状态,您的应用就会按照您为Google Plus所描述的那样运行。

    在Android 5.0及更高版本中,您可以使用与PersistableBundle和亲属的变体关联的onSaveInstanceState()相关联的相关场景。我没有玩PersistableBundle,所以我没有任何特别的建议。

答案 1 :(得分: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需要设置为 false

  

值“true”表示活动不会留下历史记录。它不会保留在任务的活动堆栈中,因此用户将无法返回该任务。 - Documentation