2

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

提前致谢..

4

2 回答 2

2

读一遍,flag_activity_clear_top 的使用永远不会有问题

以下是关于 Flag_Activity_Clear_Top 用法的简单说明。

一种正确使用的衬垫配方:

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

这是一个活动流程:

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

在上面的序列中,当我们按回到达 D 时,我们将得到 Activity C->Activity B-> Activity A ,因为在 Activity C 和 Activity D 之间没有中间活动

这里一些开发人员的神话是 -

在通过使用 C 中的标志 activity clear top 到达活动 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);

于 2013-09-23T07:08:21.470 回答
0

为什么不使用 FLAG_ACTIVITY_CLEAR_TOP 调用活动 A,然后使用 finish() 活动 D 呢?

于 2013-09-23T06:35:08.460 回答