2

我真的不明白所有这些标志是如何工作的,因为我完全按照文档所说的去做,但这并没有解决我的问题。我的活动是这样启动的:(第一个)活动A->活动B->(第二个)活动A。如果我按下按钮,它会返回到活动B->活动A->退出应用程序。现在我想从 Activity B 声明的第二个 Activity A 中,当按下返回时,它将跳过 Activity B 和第一个 Activity 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,我添加了 flags 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?真的很奇怪。

4

3 回答 3

19

读一遍,flag_activity_clear_top 的使用永远不会有问题

以下是关于Flag_Activity_Clear_Top 用法的简单说明。

一种正确使用的衬垫配方:

它总是清除调用活动和被调用活动之间的中间活动(如果有的话)。

这是一个活动流程:

活动 A -> 活动 B -> 活动 C(使用标志活动清除​​顶部转到 D)-> 活动 D

在上面的序列中,当我们按回到达 D 时,我们将得到 Activity C->Activity B-> Activity A因为在 Activity C 和 Activity D 之间没有中间活动

这里一些开发人员的神话是 -

通过使用 C 中的标志 activity clear top 到达活动 D 后,他们期望从 D 中按下后退键会将他们带到应用程序之外。这永远不会发生

Flag_Activity_Clear_Top 总是清除两个活动之间的中间活动(如果有)

于 2013-07-01T04:29:38.600 回答
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 中的完成()

于 2012-07-18T04:11:42.960 回答
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));
于 2012-07-18T04:10:14.443 回答