所以基本上我想改变起始活动,就像我有两个应用程序在一个应用程序中,当我翻转到第二个应用程序时,我必须清除活动堆栈。这可能吗?有什么想法吗?
在我看来,您已经回答了自己的问题。您写道:
所以基本上我想改变起始 Activity,就像我有两个应用程序在一个应用程序中,当我翻转到第二个应用程序时,我必须清除 Activity 栈。
我会这样做:
创建一个名为 DispatcherActivity
的 Activity,它是应用程序启动时启动的 Activity。此 Activity 是任务的根 Activity,并负责根据需要启动 A1 或 A2,但不要在自己身上调用 finish()
(即:它将被 A1 或 A2 覆盖,但仍将位于 Activity 栈的根部)。
在 A1
中,捕获“返回”键并告诉 DispatcherActivity 像这样退出:
@Override
public void onBackPressed() {
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addExtra("exit", "true");
startActivity(intent);
}
这将清除任务堆栈,直到根活动 (DispatcherActivity
),然后使用此意图再次启动 DispatcherActivity
。
在 C1
中,要启动 A2
,请执行以下操作:
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addExtra("A2", "true");
startActivity(intent);
这将清除任务堆栈,直到根活动 (DispatcherActivity
),然后使用此意图再次启动 DispatcherActivity
。
在 DispatcherActivity
中,在 onCreate()
中,您需要根据意图中的额外信息确定要执行的操作,如下所示:
Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// User wants to exit
finish();
} else if (intent.hasExtra("A2")) {
// User wants to launch A2
Intent a2Intent = new Intent(this, A2.class);
startActivity(a2Intent);
} else {
// Default behaviour is to launch A1
Intent a1Intent = new Intent(this, A1.class);
startActivity(a1Intent);
}
A2
中,拦截“返回”键,并使用与A1
中相同的onBackPressed()
覆盖来告诉DispatcherActivity退出。如果你想在按下返回按钮时关闭应用程序而不是返回上一个活动,你应该覆盖返回按钮。在覆盖方法中,在关闭活动后调用finish()方法。我希望这可以帮助你。
编辑:
请检查以下链接:这是为了关闭视图堆栈中的所有活动。在关闭应用程序之前,请关闭所有活动。
http://www.coderzheaven.com/2011/08/27/how-to-close-all-activities-in-your-view-stack-in-android/
noHistory
将阻止用户正常从 A1->B1->C1 和从 A2->B2->C2 导航。错误的方法。 - David Wasser尝试使用此意图启动A2活动 - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
使用onBackPressed和finish方法来处理此问题。
在启动其他活动之前,最好使用finish()方法关闭当前活动。
如果您想在按下返回键时返回上一个活动,请重写onBackPressed方法并调用特定的意图。
在A2活动中,在onBackPressed方法中添加finish方法(不要在此处调用上一个活动)。这是其中一种方法。
您可以在Activity A2中检查按下的按钮,如果是返回按钮,则可以关闭应用程序。您可以在A2中使用以下方法:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
this.finish();
}
return super.onKeyDown(keyCode, event);
}
finish()
不会关闭应用程序,它只会完成A2,然后返回任务中的上一个活动(可能是C1)。 - David Wasser在从活动C1传递Intent到A2时,请使用以下方式:
Intent intent=new Intent(C1.this,A2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
在您的活动A2中,通过重写返回按钮
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
A2.this.finish();
}
return super.onKeyDown(keyCode, event);
}
FLAG_ACTIVITY_CLEAR_TOP
不是你要找的。
我认为你要找的是:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
action.MAIN
和category.LAUNCHER
)。它完成自己需要做的事情,然后启动DispatcherActivity
并在自身上调用finish()
。现在只有DispatcherActivity
在活动堆栈中。其余部分按照我描述的方式工作。 - David Wasser