每当从 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。
我认为发生的情况是两个意图混淆了
- 来自 Google 商店
- 启动图标正在打开您的应用程序,
因此您可以添加 MainActivity
and/or SplashActivity
oncreate() 方法来防止这种行为,
if (!isTaskRoot()) {
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) {
finish();
return;
}
}
我的应用程序有不同的活动。显示的第一个 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。
我认为发生的情况是两个意图混淆了
- 来自 Google 商店
- 启动图标正在打开您的应用程序,
因此您可以添加 MainActivity
and/or SplashActivity
oncreate() 方法来防止这种行为,
if (!isTaskRoot()) {
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) {
finish();
return;
}
}