【问题标题】:Android task and back stack. Managing the historyAndroid 任务和回栈。管理历史
【发布时间】:2015-08-04 23:07:40
【问题描述】:

尝试在 Android 应用程序中管理任务和返回堆栈。
我在其中使用了一个滑动菜单,我可以从中启动不同的活动:Activity1、Activity2...(每个活动中的菜单都相似)。
MainActivity 是一个启动器。
我可以在这些活动之间导航,当我按下后退按钮时,我必须总是回到 MainActivity。

这就是我从没有历史记录的菜单开始活动的原因:

Intent i1 = new Intent(getApplicationContext(), Activity1.class);
i1.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i1);

问题是从 Activity1 我也可以开始一个我必须保留历史记录的意图:

Intent callIntent = new Intent(Intent.ACTION_DIAL);
callIntent.setData(Uri.parse("tel:1234567890"));
startActivity(callIntent);

拨号后我想回到Activity1,但正如你现在看到的,我又回到了MainActivity(因为没有历史记录)。

我也尝试用历史开始新的活动并完成以前的活动:

  Intent i1 = new Intent(getApplicationContext(), Activity1.class);
  finish();
  startActivity(i1);

这里一切正常,拨号意图(我不会在拨号前完成 Activity1),但每当我按下后退按钮时,我都会退出应用程序。

试图在图片上表达想法

还尝试在 manifest 中使用 noHistory,但没有成功。
在从没有历史记录的活动中开始拨号意图之前,我可以返回历史记录(带有 wlags 或 extras)吗?

如何解决?

【问题讨论】:

    标签: android android-intent back-stack


    【解决方案1】:

    应用程序退出,因为您在前往 Activity1 时完成 MainActivity 所以解决它:您可以在启动Activity1时删除finish(), 或单击 Activity1 中的后退按钮时重新启动 MainActivity 通过将此代码添加到您的 Activity1

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
    

    【讨论】:

    • 好的,谢谢。我认为它肯定会奏效。如果我在所有大约 30 个活动中都覆盖 onBackPressed 是不是好脾气?
    • 如果它是唯一的解决方案,那么使用它而不是让它未解决没有问题
    • 此外,解决方案似乎简单而出色。由于我所有的 30 个活动都扩展了 BaseActivity,因此我只是在其中覆盖了 onBackPressed。同样在开始一项活动后,我完成了之前的活动(使用拨号意图时除外)。所以我得到了我想要的一切。再次感谢您
    【解决方案2】:

    如果您的 App Map 不会更改,您可以在清单中为您拥有的每个 Activity 设置 Parent Activity 属性。

    例如

    对于 Activity 1/2/3 - 父级将是您的 MainActivity。

    您可以通过更改清单中的活动项来做到这一点

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

    另一种方法是覆盖 Activity 类中行为不同的“onBackPressed”方法

    【讨论】:

    • 这个元数据应该做什么?似乎一切都是一样的:如果在没有历史记录的情况下启动活动 - 我的拨号意图会让我回到 mainActivity。如果从历史开始活动并在它们之间切换 - 那么他们将留在后面
    • 它声明了当用户按下后退按钮时应用程序应该转到哪个活动(如果堆栈中可用)。因此,对于您的拨号活动,父母应该是 Activity 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2012-01-17
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多