清除较旧SDK上的完整Android活动堆栈(缺少FLAG_ACTIVITY_CLEAR_TASK)

时间:2011-03-01 12:52:10

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

我已经完成了对SO的阅读和搜索,但无法找到清除当前活动堆栈的方法。我的应用程序的上下文是由后台服务/通知启动的活动。

想象一下,我的应用程序允许您组织人员列表。几个小时前,您在“查看”活动中查看 person X ,现在它已成为您的堆栈顶部。在将来的某个时刻,服务会触发,我会为 person Y 弹出一个新的“通知”活动。从那里你可以编辑人Y的详细信息。

当您完成此活动时,弹出堆栈并最终查看X人员将是一种令人困惑的用户体验。理想情况下,我想回到用户正在做的任何事情(电子邮件等...),或者至少到我应用的家里。

我尝试使用FLAG_ACTIVTY_NEW_TASK启动“通知”,但这似乎没有帮助:当任务完成时,它只是返回上一个任务。我想要的似乎是Android 3的新FLAG_ACTIVITY_CLEAR_TASK,这在以前的SDK中不存在。

有没有人有建议去实现这个目标?

3 个答案:

答案 0 :(得分:20)

只需杀死所有

您可以使用BroadcastReceivers

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

public class BaseActivity extends GuiceActivity {
    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 :(得分:6)

如果您已经在堆栈中运行了应用程序主页的实例,则当活动Y完成时,您可以使用标记startActivity()启动应用程序的主页(使用FLAG_ACTIVITY_CLEAR_TOP)。由于它已经在堆栈中,而不是创建它的新实例,这将带您回到应用程序的主页并在其上清除堆栈。

答案 2 :(得分:0)

获取ArrayList并将所有活动对象保存到每个活动的oncreate()中的arraylist中。每当您想要完成特定活动时,只需从arraylist中检索该活动实例并完成该活动。