【问题标题】:How to Control Android back stack如何控制Android回栈
【发布时间】:2012-12-18 01:16:21
【问题描述】:

假设我有

A->B->C->D->E

在 android 后台堆栈中。我希望能够回到以下其中一项:

A->B->C
A->B
A

我怎样才能做到这一点?希望不要强迫点击返回按钮。

【问题讨论】:

    标签: android android-activity stack back activity-stack


    【解决方案1】:

    使用来自 Android 官方开发者页面 tasks and back stack 的图片和信息,您可以看到启动 Activity 的所有其他方式中,您只能在 Intent 标志中使用 FLAG_ACTIVITY_CLEAR_TOP 来确保此类行为。

    您的常规后退按钮如下:

    但是当你指定这个标志时,你会得到一个你需要的行为,正如this source的一个例子所给出的那样:

    考虑一个由以下活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 的 Intent 解析为 活动B,然后C和D将完成,B收到给定的 意图,导致堆栈现在是:A,B。

    【讨论】:

    • 所以我必须按意图明确调用所需的活动?即使它已经在堆栈中?问题是,在我的情况下,顶级活动只知道它应该后退多少步,而不知道谁在堆栈中坐在后面。我需要类似“在堆栈中后退 3 步”之类的东西
    • @Vlad 查看我的答案和适合您场景的 git 项目
    【解决方案2】:

    使用FLAG_ACTIVITY_CLEAR_TOP 标志。

    Intent a = new Intent(this, A.class);
    a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(a);
    

    【讨论】:

    • 这是一个正确的答案,为什么要投反对票?在 B、C、D、E 活动中,您可以向 A 发起新的意图并使用 CLEAR_TOP 标志,如果该活动在堆栈上,它将清除顶部的活动。
    • 我认为它适用于活动,但不适用于片段。
    【解决方案3】:

    实际上,要“向上”进入您选择的活动,您应该使用操作栏上使用的“向上”导航:

    /** used to handle the "up" button on the action bar, to go to the defined top activity as written on the manifest */
    public static void goUpToTopActivity(final Activity currentActivity) {
        final Intent intent = NavUtils.getParentActivityIntent(currentActivity);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        NavUtils.navigateUpTo(currentActivity, intent);
    }
    

    为了使用它,你必须在清单上设置这个函数应该使用哪个活动(或者你当然可以通过更改代码自己设置):

    如果您使用 actionBarSherlock,对于您希望让其上升的每个活动,请使用:

    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.your_app.activities.MainActivity" />
    

    如果您使用android框架(如果您的minSdk版本是API 16及以上),请使用“parentActivityName”属性。

    【讨论】:

      【解决方案4】:

      假设您正在使用 Intent 移动到另一个活动

      Intent i = new Intent(A.this,B.class);
      startActivity(i);
      

      此代码将带您进入“B”活动,当您按下返回按钮时,它将再次带您进入“A”活动。如果您不想返回活动“A”,您可以使用....

      Intent i = new Intent(A.this,B.class);
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
      startActivity(i);
      

      有关 Android 中的 Back Stack 的更多信息,请点击此链接: http://developer.android.com/guide/components/tasks-and-back-stack.html

      【讨论】:

        猜你喜欢
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多