Android从Playstore打开应用程序与启动器行为

Jez*_*spo 5 android

我观察到,如果我通过Google Play的“立即打开”按钮打开手机中安装的某些应用程序,则该应用程序将正常打开;如果我导航到该应用程序中的另一个“活动”,然后按首页,然后转到手机的启动器,打开该应用程序通过那里。我相信,它将启动一项新任务,因为该应用的启动器活动已经浮出水面。如果我按回去,那么我将进入第二个活动-这是我从Google Play启动应用程序时前台中的最后一个活动。有办法避免这种情况吗?我希望看到这种情况下的第二项活动。无论我的应用是从启动器启动还是从Google Play商店启动,我都希望执行相同的任务。

我发现Playstore中的许多应用都有此行为。Zomato应用程序就是一个很好的例子,我的应用程序是Shake Eat Off,供参考,

我一直在尝试android:launchMode在清单上运气不好。

我尝试将其设置singleTask为根活动,将“ singleTop”设置为第二个活动

我也尝试添加android:alwaysRetainTaskState="true"到根活动。

我也尝试设置singleTask为根活动和singleInstance第二个活动

因此,要进一步解释链条:

Google Play应用页面->立即打开->根活动->第二个活动(现在为前台)。按主页,单击“应用程序图标”。此时,根活动现在再次显示(但是我希望看到第二个活动,因为它是前台的最后一个活动)。按返回->第二个活动将重新出现。

Sar*_*NOB 0

发生这种情况是因为启动器意图再次启动。我看到有人在讨论社区中发布了一个简短的解决方案。我用原来的解决方案想出了一个完整的解决方案。在您的启动屏幕中,您将这些代码放在 onCreate() 中

if (!isTaskRoot()) {
    finish();
} else {
    // Place your current onCreate() codes
    // We put code here because finish() doesn't kill the activity immediately while OS takes a while to kill it and we don't need codes to be execute
}
Run Code Online (Sandbox Code Playgroud)

这些代码可以帮助您不跳过新任务并调出所有旧创建的任务

在您的启动屏幕中,如果 onResume() 中有一些代码,请将它们置于以下条件中

if (isTaskRoot()) {
    // Place your current onResume() codes
}
Run Code Online (Sandbox Code Playgroud)

这有助于您的 onResume() 代码仅在任务是旧的根任务时才执行。使用此选项是因为 onCreate() 中的 finish() 函数不会立即终止新的启动屏幕,而操作系统需要一段时间才能终止它。