【问题标题】:How to clear activity history stack when pressing home button?按下主页按钮时如何清除活动历史记录堆栈?
【发布时间】:2012-01-06 12:23:32
【问题描述】:

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

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

我该如何解决这个问题?

我已经为所涉及的活动尝试了android:noHistoryandroid:clearTaskOnLaunchAndroidManifest.xml 中的其他属性的各种组合。但它们似乎只影响活动本身,而不是整个链条。

我想删除整个活动链(ABCDE, F) 在按下 Home 按钮时从历史堆栈中提取,但在我仍在链中时仍保持堆栈完整(我希望能够按下例如,活动 B 的后退按钮,然后转到活动 A)。

【问题讨论】:

  • @dbm : 你在看这个nisha113a5.blogspot.com??还原
  • 嗨@himanshu!是的,这个问题可能也会让我得出一个可行的结论。感谢您的提示!
  • 嗨@android_hungry!该解决方案可能会奏效。但是,我不确定我是否会选择它作为我的主要实现。对我来说,这感觉有点像“dark which-craft”,它注定无法在某些设备上运行。那是一条我不敢走的捷径。
  • @dbm: 是的,你说得对,刚好在我读到你的问题的同一天通过那个帖子..

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


【解决方案1】:

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

例如 - 您在清单文件中定义活动:

   <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);

【讨论】:

  • 嗨@Martin!我冒昧地稍微修改了您的代码 sn-p,以了解如何实际获取与 activity-alias 关联的元数据。原来它不是通过调用Intent 发送的,而是从ActivityInfo 数据结构中读取的。
  • 很好的答案!考虑到您付出的努力以及您的答案是第一个事实(正确且可行,刚刚授予您一个绿色复选标记:-)
  • @Martyn 你能编辑你的答案以包含正确的数据读取吗?
  • @OvidiuLatcu,我现在重新建议了我提出的修复方法。不幸的是,我似乎还无权编辑其他人的问题/答案,因此我不能做更多,只能等待 Martyn 的审核。
  • 道歉 - 是在度假! :D 已更正代码 - 感谢您指出。
【解决方案2】:

按下home键请使用以下方法:

Intent intent=new Intent(this, HomeClass.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

【讨论】:

  • 我认为这实际上是解决我的问题的最简单方法。但是,我将使用另一种实现,这使得该解决方案这次不适合我的应用程序。但是,我确实从您的回答中学到了一些东西,为此我感谢您。
【解决方案3】:

您可以考虑为每条链仅使用一个Activity(即只有AD)。

然后实现ABCDE的内容strong> 和 F 为 Fragments,来回导航时只需更改 Activity 上显示的 Fragment。

将它与android:noHistory 结合使用,您应该会获得所需的效果 - 尽管它需要进行一些重写,并且如果您计划将目标版本定位在 Honeycomb 以下,则需要将兼容性包包含到您的项目中。

【讨论】:

  • 这实际上是对片段的一种非常优雅的使用,并且由于我的应用程序已经由片段构建,因此它甚至不会进行如此巨大的重写。尽管我认为接受@Martyn 的回答是公平的,但我认为这是我最终将采用的架构选择。谢谢你的好主意!
猜你喜欢
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多