在Android上处理活动堆栈的最佳方式

时间:2013-09-23 06:30:00

标签: android android-activity

我有一个特定的场景,而不是找到解决方案。 我的活动堆栈为A-> B-> C-> D.从D开始使用时,我想启动活动A并清除堆栈,这是我用标志FLAG_ACTIVITY_CLEAR_TOP启动活动A而实现的。 现在出现了问题: 我的活动B也可以从其他应用程序可以触发的意图开始。在这种情况下,一旦用户处于活动D并且我使用FLAG_ACTIVITY_CLEAR_TOP启动活动A,活动D仍然保留在后台堆栈中,因为活动A不在堆栈中。 有人可以指出如何处理这种情况吗?

先谢谢..

2 个答案:

答案 0 :(得分:2)

阅读一次,你将永远不会遇到使用flag_activity_clear_top

的问题

以下是有关Flag_Activity_Clear_Top使用情况的简单说明。

正确使用的一个班轮公式:

它总是清除调用活动和被调用活动之间的中间活动(如果有的话)。

这是一个活动流程:

活动A - >活动B - >活动C(使用标志活动清除​​顶部转到D) - >活动D

在上述序列中,如果我们按下则到达D,那么我们将得到活动C->活动B->活动A,因为活动C和活动D之间没有中间活动

这里的一些开发者的神话是 -

通过使用C中的标记活动清除到达活动D后,他们期望在按下来自D的后退键时将它们带到应用程序之外。这将永远不会发生。

Flag_Activity_Clear_Top始终清除两个活动之间的中间活动(如果有的话)

您可以使用BroadcastReceivers

来实现这一目标
  • 像这样创建一个BaseActivity

public class BaseActivity extends Activity {
    private KillReceiver mKillReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mKillReceiver = new KillReceiver();
        registerReceiver(mKillReceiver,
            IntentFilter.create("kill", "spartan!!!"));
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mKillReceiver);
    }
    private final class KillReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    }
}

  • 让您的活动延伸BaseActivity
  • 每当你想清除堆栈时:

Intent intent = new Intent("kill");
intent.setType("spartan!!!");
sendBroadcast(intent);

答案 1 :(得分:0)

为什么不用FLAG_ACTIVITY_CLEAR_TOP调用活动A然后完成()活动D?