【问题标题】:cleare activity stack between 2 given activities when do not keep activities flag is set in developer settings在开发人员设置中设置不保留活动标志时,清除 2 个给定活动之间的活动堆栈
【发布时间】:2013-03-21 20:28:50
【问题描述】:

我有一个应用程序,我从活动 A->B->C->D 移动。 现在我希望当我按下 D 上的按钮时,我的堆栈应该是 A->D。我已经从 android API 级别 8 到 10 做到了这一点,但在 android 4.0 上我有“不保留活动”设置,这些设置会在后台杀死我的活动,从而使 Intent.FLAG_ACTIVITY_CLEAR_TOP 和 Intent.FLAG_ACTIVITY_NEW_TASK 没用,因为我的活动 a 不存在。

我该如何处理这种情况。 非常感谢任何帮助。

【问题讨论】:

  • 如果该活动没有历史记录,那么当您从 D 回到 A 时,将再次创建 A。
  • 如果我启动一个带有 NOHISTORY 标志的活动,那么如果用户在该活动上按下主页按钮以最小化它,则该活动被杀死,当我从家里启动我的应用程序时,我会以不同的活动作为我的前面活动被杀死。
  • API >= 16 有一个简单的方法。
  • 但我的问题是我需要此代码在 API 级别 9 及更高级别上运行。

标签: android


【解决方案1】:

不要保留活动我认为这是模拟场景的开发人员选项。

我用来清理堆栈的方法,在您的情况下只有活动 B 和 C,是在该活动上注册一个广播,并在用户按下按钮时从 D 活动启动一个意图。

public void onClick(View v){
 Intent broadcastIntent = new Intent();
 broadcastIntent.setAction("com.package.CLEAR_B_C");
 sendBroadcast(broadcastIntent);
}

所以当 B 和 C 收到意图时,调用 finish()。

See that post and the answer from Francesco Laurita

【讨论】:

  • 我已经这样做了。但是这种方法的问题是我在 B 和 C 的 onCreate() 中注册了一个广播,我在 onDestroy() 中取消了它的注册,所以当 B&C 在后台使用这个开发人员选项时,调用 ondestroy 并且未注册接收器,因此活动无法获得意图。
  • 启用此选项的任何应用程序都会发生同样的情况,它仅用于模拟真实案例的开发目的,当 android 系统因内存不足或其他原因而终止您的活动时。它会破坏你离开的每一个活动,在这种情况下,当然不会收到任何意图。
  • 那么这是否意味着我们不能让这个功能在所有场景中都工作?因为 android 可以在内存不足的任何时候杀死一个活动。
  • 不在你的,当你开始一个新的活动时,所有的活动都被破坏了,所以没有以前的活动被保存在后台堆栈中(你可以使用命令adb shell dumpsys activity查看它),你将永远无法维持活动 A->D。 不要保留 Activity 测试您的应用是否会恢复保存在被杀死的 Activity 上的数据很有用。除了我之前发布的内容之外,一个解决方案可以是覆盖函数onBackPressed()并使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 向 A 添加一个意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2012-04-20
  • 2011-09-19
  • 1970-01-01
  • 2018-12-01
  • 2023-01-04
  • 1970-01-01
相关资源
最近更新 更多