我真的不明白所有这些标志是如何起作用的,因为我完全按照文档所说的那样,并没有解决我的问题。我的活动是这样推出的:(第一)活动A - >活动B - > (次)活动A.如果我按下按钮,它将返回活动B - >活动A - >退出申请。现在我想要从活动B中说明的第二个活动A,当按回来时,它将立即跳过活动B和第一个活动A,以及退出应用程序。这是代码:
从A到B:
TabActivityGroupAbs parentActivity = (TabActivityGroupAbs) ((Activity) ctx).getParent();
detailIntent = new Intent(parentActivity, B.class);
parentActivity.startChildActivity("BFromA", detailIntent);
从B到A:
TabActivityGroupAbs parentActivity = (TabActivityGroupAbs) ((Activity) ctx).getParent();
detailIntent = new Intent(parentActivity, A.class);
detailIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
detailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
parentActivity.startChildActivity("AFromB", detailIntent);
从B到A,我添加了标志FLAG_ACTIVITY_CLEAR_TOP
。但它没有清楚任何事情。当我按下时,它仍然转到活动B,然后再转到A.我做错了什么?
似乎没有任何旗帜在起作用。从A到B,我说:
detailIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
它应该阻止B被放到活动堆栈中。但事实并非如此。从第二个活动A开始,按下后它仍然会回到B.
现在我应该怎样做才能退出申请而不是从第二个活动A回到B.
编辑:我忘了提及。从B到A,如果我调用finish()来杀死活动B,那么从第二个活动A,当按回来时,它会返回到第一个活动A.为什么活动A在这里有2个实例,虽然我设置了FLAG_ACTIVITY_CLEAR_TOP?真奇怪。答案 0 :(得分:18)
阅读一次,你将永远不会遇到使用flag_activity_clear_top的问题
以下是关于 Flag_Activity_Clear_Top的使用的简单说明。
正确使用的一个班轮公式:
它总是清除调用活动和被调用活动之间的中间活动(如果有的话)。
这是一个活动流程:
活动A - >活动B - >活动C(使用标志活动清除顶部转到D) - >活动D
在上述序列中,如果我们按下则到达D,那么我们将得到活动C->活动B->活动A , ,因为活动C和活动D之间没有中间活动
这里的一些开发者的神话是 -
通过使用来自C的标记活动清除顶部达到活动D后,他们期望在按下来自D的后退键时将它们带到应用程序之外。将永远不会发生。
Flag_Activity_Clear_Top始终清除两个活动之间的中间活动
答案 1 :(得分:6)
From B to A, I add the flags FLAG_ACTIVITY_CLEAR_TOP. But it didn't clear anything. When I pressed back, it still went to Activity B, and then A again. What did I do wrong?
FLAG_ACTIVITY_CLEAR_TOP
清除中间活动而不是之前的活动,从堆栈中删除活动B,在调用活动A时必须在B中调用finish()
答案 2 :(得分:0)
您可以使用以下方法启动和关闭子活动
public ArrayList<String> mIdList;
/**
* Starts an Activity as a child Activity to this.
*
* @param Id
* Unique identifier of the activity to be started.
* @param intent
* The Intent describing the activity to be started.
* @throws android.content.ActivityNotFoundException.
*/
public void startChildActivity(String Id, Intent intent) {
Window window = getLocalActivityManager().startActivity(Id,
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
if (window != null) {
mIdList.add(Id);
setContentView(window.getDecorView());
}
}
/**
* This is called when a child activity of this one calls its finish method.
* This implementation calls {@link LocalActivityManager#destroyActivity} on
* the child activity and starts the previous activity. If the last child
* activity just called finish(),this activity (the parent), calls finish to
* finish the entire group.
*/
@Override
public void finishFromChild(Activity child) {
LocalActivityManager manager = getLocalActivityManager();
int index = mIdList.size() - 1;
if (index < 1) {
finish();
return;
}
manager.destroyActivity(mIdList.get(index), true);
mIdList.remove(index);
index--;
String lastId = mIdList.get(index);
Intent lastIntent = manager.getActivity(lastId).getIntent();
Window newWindow = manager.startActivity(lastId, lastIntent);
setContentView(newWindow.getDecorView());
}
示例:
startChildActivity("Merchants", new Intent(this,MerchantScreen.class));