【问题标题】:Android: resume an Activity with singleTop or SingleTaskAndroid:使用 singleTop 或 SingleTask 恢复 Activity
【发布时间】:2012-10-22 22:28:49
【问题描述】:

我已经为我的问题寻找解决方案很长时间了,但是 Android 文档不是很清楚,网络解决方案也不能完全正常工作。

我正在开发一个游戏,其中主 Activity(游戏发生的地方)可以调用另一个简单的 Activity,然后返回。 它会像这样工作:

  1. 如果用户点击 Home 按钮然后返回游戏,则必须停止 Activity 并在没有通过 onDestroy 的情况下恢复(否则会丢失游戏状态)
  2. 主 Activity 调用其他 Activity 然后返回游戏时的相同功能。
  3. 当用户按下退出按钮时,游戏必须退出

对于前两点,我尝试这样做以确保创建并调用一个且只有一个主 Activity:android:launchMode="singleTask"android:launchMode="singleTop" 但不幸的是,第一个适用于第一个问题,第二个适用于第二个问题,不适合两者!

我认为问题是:使用 singleTop 时,主 Activity 实际上并不在第二个 Activity 调用它的顶部(要清楚,我不明白我应该在什么情况下调用已经在堆栈顶部的活动!)。相反,singleTask 确保 Activity 在其堆栈中是唯一的,但是在用户单击 Home 按钮并返回到 Application 后,会调用另一个 Task,对吗?

无论如何,这是一个聪明的解决方案,还是我应该在 onStop/onPause 中保存我的游戏状态,然后在 onResume 中恢复它?

对于第三点,我尝试将android:noHistory="true" 添加到每个 Activity,然后当用户单击退出按钮时,我调用一个新 Activity,除了 onCreate 上的 finish() 方法之外什么都不做,这个 Activity 被调用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);,它的launchMode是singleInstance,但它不起作用,它只是在主Activity中总是返回。

【问题讨论】:

    标签: android android-intent android-activity


    【解决方案1】:

    你绝对不想惹launchMode。这不是解决这个问题的方法,只会给你带来更多的问题。

    Android 可以(并且将会)随时终止您的进程(尤其是当您的应用程序在后台时)。因此,您需要将游戏状态保存在 onPause(),因为这是您保证拥有的唯一机会。

    无论如何,如果您将游戏保存在 onPause() 中,标准行为将涵盖您的前 2 点。

    对于您的第三点,有几个选项:

    1. 你可以用startActivityForResult()开始所有的活动,看我的回答here
    2. 当您想“退出”时,您只需返回根活动(启动应用程序的活动)并告诉它您想退出。

    像这样:

    Intent intent = new Intent(this, MyRootActivity.class); // this is the starting activity for your application
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // tells Android to finish all other activities in the stack
    intent.addExtra("exit", "true"); // this tells your root activity that you want to exit
    startActivity(intent);
    

    现在,您想在您的MyRootActivity 中将此代码添加到onCreate()

    Intent intent = getIntent();
    if (intent.hasExtra("exit")) {
        // User wants to exit
        finish();
    }
    

    【讨论】:

    • 感谢您的回答。对于前两点,我使用 android:launchMode="singleTask" 解决并删除了 android:noHistory="true" (我认为这是真正的问题)。保存 onPause() 上的状态可能是一种选择,但是如何保存 Activity 的 UI 外观?关于第三点......这正是我使用的解决方案,但没有奏效,因为另一个任务上有主要活动。我解决了在根 Activity 上调用 finish(),然后检查主 Activity 的 onResume() 是否设置了标志“exit”,在这种情况下,我立即调用 finish()。
    • 您不需要使用launchMode="singleTask"。标准启动模式会做你想做的事。如果没有,那么你做错了什么。您的整个应用程序应该在一个任务中运行,而不是在多个任务中运行。没有理由这样做。
    • 我同意,但这不是我的错,问题是谷歌的疯狂选择!我希望主 Activity 始终是一个且只有一个(除非内存不足的罕见情况,否则不得破坏)并且此 Activity 不能位于堆栈顶部。所以经典的launchMode会创建我的活动的多个实例,singleTop只有在它位于顶部时才会恢复活动,但我不明白如果我从另一个活动中调用它怎么会在顶部!
    • 如果您获得了主要活动的多个实例,那么您做错了什么。说明您在哪里获得多个实例以及在这些情况下如何开始活动。
    • 您应该将状态保存在 onSaveInstanceState 而不是 onPause
    猜你喜欢
    • 2017-02-12
    • 2014-11-17
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多