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

Rom*_*ain 12 android android-intent android-activity back-stack

我已经在SO上做了一些阅读和搜索,但找不到清除当前活动堆栈的方法.我的应用程序的上下文是由后台服务/通知启动的活动.

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

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

我尝试启动"通知",FLAG_ACTIVTY_NEW_TASK但似乎没有帮助:当任务完成时,它只是回到上一个任务.我想要的似乎是Android 3的新功能FLAG_ACTIVITY_CLEAR_TASK,这在之前的SDK中并不存在.

有没有人有建议去做到这一点?

Cri*_*ian 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 让您的活动扩展BaseActivity.
  • 每当你想清除堆栈时:

Intent intent = new Intent("kill");
intent.setType("spartan!!!");
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

  • 这是完全错误的.它没有考虑Android的工作原理.假设任务中的一个Activity被系统杀死(例如内存不足).此活动不会被BroadcastReceiver杀死,因为它已被系统杀死.问题是,它将保留在后台. (8认同)
  • 当您想要在清除其余部分时启动不在历史堆栈上的活动时,效果很好."斯巴达!!!" MIME类型很有趣,但会抛出RuntimeException:错误的MIME类型.应该更改为"text/plain",以便示例按原样工作.:P哦,你应该将kill意图的名称改为`maliciousIntent`. (3认同)

小智 6

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