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

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

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

  • 如果应用程序仍在“最近使用的应用程序”列表中,并且您打开它(通过图标或从最近使用的应用程序,这并不重要),您将从上次离开的位置恢复该应用程序。
  • 如果该应用不再出现在“最近使用的应用”列表中,当您打开它时,您会看到一个启动屏幕,然后定向到主页。

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

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

感谢您耐心阅读本文。

最佳答案

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

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

  2. 时间不长,因此 Android 希望用户认为您的应用自从离开后就一直在运行。然而,由于内存压力,Android 在后台终止了您的进程。在这种情况下,Android 会为您 fork 一个新进程,创建 Activity 的实例,并将您在 onCreate() 中保存的实例状态 Bundle 传递给您onRestoreInstanceState()

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

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

在 Android 5.0+ 上,PersistableBundle 中绑定(bind)了一些相关场景,您可以将其与 onSaveInstanceState() 和 kin 的变体一起使用。我没有太多使用 PersistableBundle,因此我没有任何与之相关的具体建议。

关于android - 检测应用程序刚刚启动或从最近的应用程序打开的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36946240/

相关文章:

java - 尝试在 Android Studio 上启动我的第三个 Activity 时被重定向到初始 Activity

android - getTheme().applyStyle(...) 多次而不覆盖前一个

java - 如何将 60 个整数存储在要从数据库写入/读取的类中?

javascript - 手机浏览器识别移动设备的解决方案

java - 如何在我的 for 循环线性布局 ImageView 中添加 OnClickListener?

java - 二进制 XML 文件行 #17 : Duplicate id , 标记为 null,或带有另一个 fragment 的父 ID

java - 使用 XML for Fragments 有什么意义?

java - 单击按钮时 Android 倒计时器应用程序崩溃

android - 数据绑定(bind)膨胀非常慢

android - 如何在注销android时完成多个 Activity