每当从 Play 商店启动并放回后台时,Top Activity 就会被删除

Top Activity is removed whenever started from play store and put back to background

我的应用程序有不同的活动。显示的第一个 Activity 是 SplashActivity,它将立即打开 AuthActivity 或者如果授权 MainActivty.

MainActivity 可以导航到更多活动,我现在将仅引用为 OtherActivity

我的问题是: 每当我从显示“打开应用程序”的 Play 商店安装对话框启动应用程序时,然后登录,导航到 OtherActivity,将应用程序置于后台并单击我的应用程序的启动器图标,MainActivity 显示。

然而,在终止应用程序并通过启动器图标打开它后,导航到 OtherActivity,将应用程序置于后台,通过启动器再次打开它,显示 OtherActivity

问题:如何解决这个问题,使 OtherActivity 始终保持在最前面?

到目前为止我发现,从 Playstore 启动和从启动器启动之间的区别在于类别:android.intent.category.LAUNCHER

模拟 Play 商店adb shell am start -a android.intent.action.MAIN -n com.example/com.example.SplashActivity

模拟启动器adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n com.example/com.example.SplashActivity

清单如下所示:

<activity
    android:name=".SplashActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="*"
            android:scheme="com.example" />
    </intent-filter>

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="*"
            android:scheme="com.example" />
    </intent-filter>

</activity>

编辑: 我认为这与 this issue

有关

编辑: OtherActivity在清单中注册并启动如下:

<activity
    android:name=".OtherActivity"
    android:label=""
    android:theme="@style/AppTheme"/>
startActivity(
    Intent().apply {
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        setClassName(context, "com.example.OtherActivity")
    }
)

当您传递这些标志时 FLAG_ACTIVITY_CLEAR_TASK|FLAG_ACTIVITY_NEW_TASK 您的 activity 将成为根 activity。

我认为发生的情况是两个意图混淆了

  1. 来自 Google 商店
  2. 启动图标正在打开您的应用程序,

因此您可以添加 MainActivity and/or SplashActivity oncreate() 方法来防止这种行为,

 if (!isTaskRoot()) {
            if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) {
                finish();
                return;
            }
        }