如何检测Android应用程序是从应用程序活动历史记录还是从启动器还原的

如何检测Android应用程序是从应用程序活动历史记录还是从启动器还原的,android,android-lifecycle,Android,Android Lifecycle,与此相关,有一些关于检测恢复用户操作的好提示和解决方案 不幸的是,这并没有给我一个具体的答案: 问:如何检测用户是否通过使用启动器链接或使用活动历史记录恢复了应用程序 事实上,在我看来,无论应用程序如何重新打开,应用程序在生命周期中都会进入相同的回调,并进行系统调用 关于原因: 从技术上讲,这是明确和直截了当的。从用户的角度来看,这可能会有所不同,因为如果他从“应用程序历史记录”中打开应用程序,他实际上希望保持上次离开应用程序时的状态。如果他点击应用程序图标,他会愚蠢地说我们“打开应用程序”不会

与此相关,有一些关于检测恢复用户操作的好提示和解决方案

不幸的是,这并没有给我一个具体的答案:
问:如何检测用户是否通过使用启动器链接或使用活动历史记录恢复了应用程序

事实上,在我看来,无论应用程序如何重新打开,应用程序在生命周期中都会进入相同的回调,并进行系统调用

关于原因: 从技术上讲,这是明确和直截了当的。从用户的角度来看,这可能会有所不同,因为如果他从“应用程序历史记录”中打开应用程序,他实际上希望保持上次离开应用程序时的状态。如果他点击应用程序图标,他会愚蠢地说我们“打开应用程序”不会恢复任何“会话”

不,这是不可能的

根据设计,这两种情况的生命周期是相同的

关于原因:从技术上讲,这是明确和直截了当的。从用户的角度来看,这可能会有所不同,因为如果他从“应用程序历史记录”中打开应用程序,他实际上希望保持上次离开应用程序时的状态。如果他点击应用程序图标,他会愚蠢地说我们“打开应用程序”,不希望恢复任何“会话”

我需要同样的。 若系统并没有终止应用程序的进程,则一切正常(正如用户所期望的):系统切换到最后显示的窗口,并按预期绘制它

但若系统终止了应用程序的进程(例如由于内存不足),那个么该进程在历史记录中仍然是可见的。 为了检测“状态恢复的必要性”,我在函数中使用参数savedInstanceState的值

@Override
protected final void onCreate(@Nullable Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    boolean needRestoreState = savedInstanceState != null;
    ....
}
当用户第一次启动应用程序时,savedInstanceState为null,needRestoreState==false;否则,当用户切换到最近的应用程序列表中的应用程序时,savedInstanceState!=null,并且needRestoreState==true。好了,我们开始恢复

在我尝试使用安卓9.0设备之前,很多安卓设备都可以正常工作。在Android 9.0上,savedInstanceState始终为空((),但完全相同的应用程序在Android 7.0上运行良好

我找到了解决方案。我使用Activity的标志\u Activity\u LAUNCHED\u FROM\u HISTORY。如果应用程序从HISTORY启动,它将设置为1。即使在Android 9.0上也可以工作:

protected final void onCreate(@Nullable Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    boolean from_history = GlobalSettings.getFlagValue(this.getIntent(), Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    bool needRestoreState = savedInstanceState != null || from_history;

    ...

}

private static boolean getFlagValue(Intent intent, int flagMask)
{
    int flags = intent.getFlags();
    return (flags & flagMask) != 0;
}

说真的,你为什么需要它?这一点都不重要。在这两种情况下,无论是从多任务窗口还是应用程序启动器,场景示例都会发生。无论哪种情况,都会发生相同的系统调用。这闻起来像是一个。没有理由想知道这一点。谢谢你的反馈@Zun和Malavan rockzz。我添加了一个短语,也许是这样现在更有可能的是你不打我;)