清除Activity返回堆栈

8

我从活动A开始->B->C->D->E ..当我从D->E前进时,堆栈中不应该有任何活动,但是用户可以使用返回按钮从D返回到C(无需刷新活动C,就像正常的后退功能一样)

3个回答

17
你可以在想要关闭的所有活动(A,B,C,D)中添加一个 BroadcastReceiver
public class MyActivity extends Activity {
    private FinishReceiver finishReceiver;
    private static final String ACTION_FINISH = 
           "com.mypackage.MyActivity.ACTION_FINISH";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        finishReceiver= new FinishReceiver();
        registerReceiver(finishReceiver, new IntentFilter(ACTION_FINISH));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(finishReceiver);
    }

    private final class FinishReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ACTION_FINISH)) 
                finish();
        }
    }
}

通过调用...来打开它们,并通过调用...来关闭它们。

sendBroadcast(new Intent(ACTION_FINISH));

通过简单的调用可以完成 Android 应用程序中所有活动的结束,这个不错的例子也值得参考。


你是救命恩人...非常感谢... - W00di
1
很不幸,这个问题有太多的关闭投票者了,尽管它与提到的重复问题略有不同。上面的解决方案可能看起来有些过大,但它非常灵活和强大 :) - Trinimon
1
感谢分享解决方案。这种情况肯定是不同的,新的活动之前并没有在后退栈中。 - Roman
这是一个非常棒的解决方案。比其他方案更加强大和清晰。 - MattCochrane

5
将标志FLAG_ACTIVITY_CLEAR_TOP添加到您的意图中,以便在启动E活动时清除其他活动的后退堆栈,例如:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

然后启动您的Activity:

startActivity(intent)

更多信息:任务和返回栈


1
但是这仅在活动已经在堆栈中的情况下才有效。 - W00di
@sabya:请更详细地解释你的问题,有点不清楚。 - Arash GM
1
从文档中得知:"如果设置了此标志,并且要启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将其上面的所有其他活动关闭,并将此 Intent 作为新 Intent 传递给(现在位于顶部的)旧活动。"(请参见http://developer.android.com/reference/android/content/Intent.html) - Trinimon
@Arash:我从活动A开始,然后移动到活动B,接着是C、D,最后我从活动D移动到活动E。但是当用户从E点击返回按钮时,堆栈中不应该有任何活动。 - W00di
@sabya:如果你的Activity在同一个任务中,那么这个标志应该清除你的返回栈,在启动最后一个Activity之前添加这个标志即可。 - Arash GM
@Arash,我已经尝试过了,但不起作用。如果我按照你的方法启动Activity A而不是E,它会像你说的那样工作...但我不想这样做。我希望启动一个新的Activity E,而不是有堆栈历史记录。 - W00di

0
添加标志到你的intent,它将会清除堆栈中的所有活动。
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |  Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

这是清除已经在堆栈中的后退活动的正确方式。

希望这能有所帮助。


还是不行... :( - W00di

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接