【问题标题】:Android activities navigation flow problemAndroid活动导航流程问题
【发布时间】:2011-11-06 18:28:15
【问题描述】:

我有启动活动 B(singleInstance) 的活动 A。在活动 B 中有一个后退按钮,用于启动活动 A 的意图。

A -> B -> A

我想实现以下行为:

用户在 A 上触发 B,然后按我的后退按钮,返回到活动 A 并按设备的硬件后退按钮,将他导航到设备的主屏幕。

现在看起来像这样: 用户在 A 上触发 B,然后按下我的后退按钮,返回到活动 A 并按下设备的硬件后退按钮,该按钮再次将他导航到活动 A,然后再次按下后退按钮并打开活动 B。然后他按下后退按钮和活动 A发生,这是一个无限循环....

我不能使用标志 NO_HISTORY,因为我想从其他一些原因保存活动 B 的状态。 Activity B 是一个 webBrowser,所以我重载了 onSaveInstanceState 和 onRestoreInstanceState 方法来保存在加载的缓存网站中。

现在我在活动 A 中重载了 onBackPressed 方法,通过启动主屏幕的意图,但这不是一个好的解决方案。

您还有其他想法吗?

代码如下:

活动 A: Intent browser = new Intent(this, B.class); this.startActivity(browser);

活动 B: ` @覆盖 public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState);
callWebViewMethod("saveState", new Class[] { Bundle.class }, 新对象[] { savedInstanceState }); } @覆盖 公共无效 onRestoreInstanceState(捆绑保存的实例状态){ super.onRestoreInstanceState(savedInstanceState);

    callWebViewMethod("restoreState", new Class[] { Bundle.class }, 
            new Object[] { savedInstanceState });
}   
@Override
public void onBackPressed() {
    if (webView != null) {
        if ( ( Boolean )callWebViewMethod( "canGoBack" ) )
        {
            callWebViewMethod("goBack");
        }
        else
        {
            startActivity( getBackIntent() );
        }
    }
}
private Intent getBackIntent() {
    Intent i = new Intent();
    // some code here           
    i.setClass(this, A.class);
    return i;
}`

【问题讨论】:

    标签: android


    【解决方案1】:
    after that press my back button
    

    finish() activity B这里..

    从您的活动 A 中删除 onBackPressedmethod。

    【讨论】:

    • 当我将finish() 放入Activity B 时,我会丢失加载的网页,我不想要它。
    【解决方案2】:

    如果您不想导航回 Activity,可以尝试将 finish(); 放在 startActivity(); 之后

    【讨论】:

    • 当我将finish() 放入活动B 时,我将丢失加载的网页,我不想要它。我还尝试在从活动 B 到 A 的意图上使用 FLAG_ACTIVITY_CLEAR_TOP 标志,但它也无法按预期工作。
    【解决方案3】:

    在您的代码中:

    @Override
        public void onBackPressed() {
        if (webView != null) {
            if ( ( Boolean )callWebViewMethod( "canGoBack" ) )
            {
                callWebViewMethod("goBack");
            }
            else
            {
                startActivity( getBackIntent() );
            }
        }
    }
    

    您无需创建新的 Intent 即可返回 Activity A。只需摆脱 Else 条件即可。

        @Override
        public void onBackPressed() {
            if (webView != null) {
                if ( ( Boolean )callWebViewMethod( "canGoBack" ) )
                {
                    callWebViewMethod("goBack");
                }
            }
            else {
                super.onBackPressed(); // pass to the default handler
            }
        }
    

    【讨论】:

    • 是的,它在活动 B 中按预期工作,但是当我返回活动 A 时,它会创建另一个实例,然后当我按下返回按钮时,它会返回活动 B。见下文:A1 - > B -> A2 -> A1 -> B -> A -> B -> ...
    • 您能否发布您在活动 A 和活动 B 课程中的代码。
    • 如果我这样做,我将通过触发后退按钮剥夺用户返回活动 A 的可能性...
    • 对不起,请看我的修改。如果您调用 super.onBackPressed,默认处理程序将完成它的工作。
    • 感谢@C0deAttack 的所有评论。您的解决方案有效,但问题是我的方法getBackIntent 中有一些额外的逻辑,我担心我不能辞职。有没有办法从活动 B 到 A 的意图来做到这一点?此外,当我触发 super.onBackPressed 时,我会丢失 savedInstanceState,因为它会完成我的活动。
    【解决方案4】:

    不要覆盖 onBackPressed,不要调用完成。 当您开始每个活动时,将意图标志设置为

    Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
    

    【讨论】:

    • 如果我将活动 A 重新排序到前面,我仍然会有活动 B 在后面。我想通过按返回按钮从活动 A 转到设备的主屏幕。现在我有 A1 -> B -> A2 -> A1 -> B -> A -> B -> .... 我将有 A -> B -> A -> B -> A -> B 请注意在活动 BI 中覆盖了创建新意图的 onBackPressed 方法,这就是它循环的原因。问题是,如何保存网络浏览器状态并从 backButton 导航历史中清除活动 B??
    • 正如我所建议的 - 不要覆盖 onbackPressed。您将只有 A 和 B 的一个实例。如果您从 A 第二次转到 B,它将处于与您通过后退按钮离开时相同的状态
    【解决方案5】:

    在从 A>B 跳转到 B 时创建新意图

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

    当您从活动 B 中按下时,只需调用 onBackPressed 方法

    onBackPressed();
    

    当您退回到活动 A 并且您想从 A 跳转到 HomeActivity 时,请覆盖 onBackPressed() 方法。

    @Override
        public void onBackPressed() {
           Intent intent = new Intent(A.this,HomeActivity.class);
           startActivity(intent);
        }
    

    如果你从 B 跳到 home 并且他们按回它会跳回到最后打开的活动,因为 android 维护你的活动的堆栈。如果您不希望活动堆栈中的活动,请确保完成()活动,或者您可以使用此代码清除整个堆栈。

     Intent intent = new Intent(B.this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
    

    这将创建新的 Activity,它们不会是任何堆栈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多