Google Play和启动器启动了单独的活动

时间:2018-10-03 07:59:16

标签: android

假设我有一个简单的应用,其中包含一个SplashScreenActivity和一个MainActivity
以下是我的AndroidManifest.xml的一部分:

    <activity
        android:name=".front.activities.splashscreen.SplashScreenActivity"
        android:launchMode="standard"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".front.activities.main.MainActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:label="@string/Main_Title"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"/>

然后我的SplashScreenActivityMainActivity中打开onCreate()

问题

如果该应用是从Google Play而不是启动器启动的,那么如果我按下主屏幕并单击启动器中的应用图标,则会再次启动另外一个SplashScreenActivity,因此在后堆栈上还会启动另外一个MainActivity

复制步骤

  1. 杀死该应用程序(如果已打开)。
  2. 从Google Play打开应用。
  3. 按“主页”按钮
  4. 从启动器中打开应用。您会知道SplashScreenActivity已再次启动(或通过查看日志)
  5. 重复步骤3-4。每次重复时,都会启动另外一个SplashScreenActivityMainActivity

经过几次尝试,如果我们按“后退”按钮,我们会注意到后退堆栈中有多个MainActivity

更多信息

  1. 如果该应用不是从Google Play启动,而是在第一次启动时启动(步骤2),则无法复制。
  2. 不仅是Google Play,发送意图启动该应用程序的任何其他应用程序都可以重现此内容。
  3. 如果我先从启动器启动,然后再从Google Play启动,则会启动2 SplashScreenActivity。但是,如果我再次按下启动器中的应用程序图标,它将不会创建第三个SplashScreenActivity。它将第一个启动的MainActivity带到顶部。

我尝试了什么

  1. SplashScreenActivity设为android:launchMode="singleTask"。没有帮助。
  2. MainActivity设为android:launchMode="singleTask"。这将防止创建多个MainActivity,但不能解决多次启动SplashScreenActivity的问题。您可能还假设MainActivity不应设置为singleTask

我所期望的

通过单击启动器中的应用程序图标,Android应该能够在我的任务管理器中发现该应用程序已启动,并且只需将其置于顶部即可。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

某些启动器存在此错误:从主屏幕启动应用程序时,会创建新的初始活动实例,而不是继续运行该应用程序。可以通过添加

来解决
if (!isTaskRoot()) {
    finish();
    return;
}

至初始活动的onCreate()。 另请参阅:

Resume last activity when launcher icon is clicked

Resume the Top Activity instead of starting the Launcher Activity

答案 1 :(得分:0)

添加 android:noHistory="true"

标记以启动屏幕活动。它总是填充一个实例,也不会存储在后堆栈中。