android - 按下主页按钮时如何清除 Activity 历史堆栈?

标签 android android-activity back-stack android-navigation

我正在编写一个有两种“模式”的应用程序;一种查看 模式和一种编辑 模式。该应用程序公开了两个主要/启动器 Activity (例如,AD),这两个 Activity 又具有自己的 Activity 链(B CE,分别为 F)。两个入口点 Activity AD 将在主屏幕中显示两个带有单独标签的图标,并且这两条链永远不会交叉,即一旦您在 View 中启动应用程序模式与 Activity A,你唯一可以来回走的路线是ABC,如果您使用 Activity D 在编辑模式下启动应用程序,唯一可用的 Activity 链是 DEF .

现在,我的问题是如果启动应用程序,例如查看模式( Activity 链 ABC),然后从该链中的任何 Activity 中按主页按钮我回到主屏幕(当然)但如果我随后在编辑模式下重新启动应用程序( Activity 链 DEF),我会到达按下主页按钮时我所在的 Activity (即错误链中的 Activity ) - 不是编辑模式的预期入口点; Activity D

我该如何解决这个问题?

我已针对相关 Activity 尝试了 android:noHistoryandroid:clearTaskOnLaunchAndroidManifest.xml 中其他属性的各种组合。但它们似乎只影响 Activity 本身,而不是整个链条。

我想删除整个 Activity 链(ABCDE, F) 从 history stack 当 Home 按钮被按下时,但仍然保持堆栈完好无损,而我仍然在链中(我希望能够按下例如,从 Activity B 返回按钮并转到 Activity A)。

最佳答案

听起来您需要在家庭 Activity 中使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志,但您当然不能在 AndroidManifest.xml 文件中添加这些标志。也许你应该有一个单一的入口点,然后启动正确的 Activity - 你可以使用 activity-alias使它看起来像用户的两个入口点。

例如 - 您在 list 文件中定义 Activity :

   <activity-alias
        android:label="@string/edit_app_name"
        android:name="launch_edit"
        android:targetActivity=".activities.LaunchActivity">
        <meta-data android:name="launch_type" android:resource="@string/launch_edit" />
    </activity-alias>
    <activity-alias
        android:label="@string/view_app_name"
        android:name="launch_view"
        android:targetActivity=".activities.LaunchActivity">
        <meta-data android:name="launch_type" android:resource="@string/launch_view" />
    </activity-alias>

然后在您的 LaunchActivity 中您有:

ActivityInfo activityInfo = getPackageManager().getPackageInfo( this.getComponentName(), PackageManager.GET_ACTIVITIES|PackageManager.GET_META_DATA);
int launchTypeResource = activityInfo.metaData.getInt("launch_type");
String launchType = context.getString(launchTypeResource);
if(launchType == null) {
   // handle error
   throw new Exception();
}
Intent newIntent;
if(launchType.equals(context.getString(R.string.launch_view)) {
    newIntent = createIntent(ViewActivity.class);
} else if(launchType.equals(context.getString(R.string.launch_edit)) {
    newIntent = createIntent(EditActivity.class);
}
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(newIntent);

关于android - 按下主页按钮时如何清除 Activity 历史堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8757754/

相关文章:

android - 我应该使用 ListView 吗?

java - 如何简化多个IF语句?

android - 我的代码足以防止 MediaPlayer 泄漏吗?

android - 为 Firebase 通知后启动的 Activity 构建任务堆栈

Android popBackStack 不加载 ListFragment 中的 ListView

android - 从后台获取特定的 Activity

java - 使 NotificationListenerService 保持 Activity 状态的解决方法

java - 膨胀 MaterialAnimatedSwitch 时出错

android - IllegalStateException - Fragment.getResources

Android - 启动应用程序后启动相同的 Activity