如果要保留您目前的广播逻辑,则无法修复此问题。
我认为,从后台堆栈中杀死活动并不是正确的方法。您应该强烈考虑更改导航逻辑。
但是,如果您的项目很大,时间很紧,重构也不可行,那么A.J.的方法是有效的,但是您提到您有许多需要结束的活动,他的解决方案就变得非常棘手。
我建议采用以下方法。这可能不是最好的想法,但我想不到其他更好的方法了。也许这可以帮助到您。
您应该具备以下内容:
- 所有活动的基础活动。
- 在应用程序级别上拥有一个
ArrayList<String> activitiesToKill
对象。(如果您没有扩展Application
,则可以将其设置为静态变量)
首先,我们必须确保当操作系统在低内存下终止应用程序时,activitiesToKill
不会丢失。 在BaseActivity
中,在onSaveInstanceState
期间保存列表,并在onRestoreInstanceState
中恢复它。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("activitiesToKill", activitiesToKill);
}
private void onRestoreInstanceState(Bundle state) {
if (state != null) {
activitiesToKill = (ArrayList<String>) state.getSerializable("activitiesToKill");
super.onRestoreInstanceState(state);
}
这里的想法是通过使用它们的名称来保存应该在列表中被杀死的活动。
逻辑如下:
假设您有A、B、C、D和E等活动
从活动E开始,您按下按钮并希望杀死B和D
当您在E中按下按钮时,将B和D的名称添加到activitiesToKill
对象中。
activitiesToKill.add(B.class.getSimpleName()
activitiesToKill.add(D.class.getSimpleName()
在BaseActivity的
onCreate
方法中,我们需要检查是否存在。
if(savedInstanceState != null)
{
if(activitiesToKill.contains(this.getClass().getSimpleName()))
{
activitiesToKill.remove(this.getClass().getSimpleName())
finish();
}
}
如果通过广播杀死应用程序,请确保删除活动的名称。
基本上,在每种情况下都会发生以下情况:
如果应用程序正常运行并且您点击按钮,则会发送广播并使B和D被杀死。请确保从activitiesToKill
中删除B和D。
如果应用程序已经被杀死并恢复,您按下按钮,广播不会产生任何效果,但您已将B和D添加到activitiesToKill
对象中。因此,当您点击返回时,该活动将被创建并且savedInstanceState不为null,则该活动将被结束。
此方法考虑到E活动知道需要杀死哪些活动。
如果您不知道要从E活动杀死哪些活动,则必须稍微修改此逻辑:
不要使用ArrayList,而是使用HashMap<String,bool>
当创建B活动时,它会将自己注册到哈希映射表中:
activitiesToKill.put(this.class.getSimpleName(), false)
从活动E开始,您只需要将所有条目设置为
true
然后在基本活动的onCreate中,您必须检查是否该活动已在activitiesToKill中注册(哈希映射包含键)且布尔值为
true
,则杀死它(不要忘记将其返回为false或删除键)
这确保每个活动都向HashMap注册自己,而Activity E不必知道所有要终止的活动。并且不要忘记在广播杀死它们的情况下将它们移除。
这种方法还确保在从意图正常打开时不会杀死活动,因为在这种情况下,在onCreate中 onSaveInstanceState将为空,因此不会发生任何事情。
如果有一组需要根据不同条件(不仅是按钮单击)终止的活动,则可以执行更高级别的检查,因此可以使用哈希图的哈希图将它们分成类别。
另请注意,如果有多个名称相同但bundle不同的活动,则可以使用getName而不是getSimpleName。
我希望我的解释足够清楚,因为我是靠自己的头脑写的,如果有任何不明确的地方,请让我知道。
祝您好运
Intent
标志或<activity>
属性来帮助控制后退栈。如果一个活动试图销毁另一个活动,那就错了。 - CommonsWare