【问题标题】:How will I permanently exit my Android app using onBackPressed from my last Activity如何使用我上次活动中的 onBackPressed 永久退出我的 Android 应用程序
【发布时间】:2015-03-30 21:57:36
【问题描述】:

我的 Android 应用中有 8 个活动,我想要:

1) 每次我在前 7 个活动中按返回按钮以返回到我之前的活动(Act1

2) 仅当我在第 8 个活动中时,我才绝对要退出我的 Android 应用程序并转到手机的主屏幕。我尝试通过在我的第 8 个活动中覆盖 onBackPressed method 来做到这一点(手机主屏幕

我找到了一个 Android 实现,我在其中插入了 finish();在我所有 8 个活动的每个意图中,但这不是我想要的,因为这样我就无法回到以前的活动任何时候我想(finish(); 每个当前 Activity 都会从后台堆栈中删除)。

请问我该怎么做?

到目前为止,我在第 8 个活动中的代码是:

            @Override
            public void onBackPressed()
            {

                   Intent intent = new Intent(Intent.ACTION_MAIN);
                   intent.addCategory(Intent.CATEGORY_HOME);
                   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                   startActivity(intent);
                   finish();

            }

【问题讨论】:

    标签: android android-intent android-activity exit onbackpressed


    【解决方案1】:

    另一种方式:创建第 9 个 Activity 并将其命名为 FinishAllActivity 或类似的名称。让这个活动调用finish(),然后返回它的onCreate()

    在活动 8 的 onBackPressed() 中,使用 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK 标志启动 FinishAllActivity(有关详细信息,请参阅 this question)。活动 1-8 将从堆栈中删除,然后第 9 个活动将启动并立即终止,并且您的任务堆栈被清除。当您重新打开应用程序时,它应该从 Activity 1 开始。

    这样做的好处是您不必修改活动 1-7。

    【讨论】:

    • 不是实现这一目标的最佳方式,但它确实有效。顺便说一句,我想澄清一下,Android 有自己的终止应用程序的方式。在我的这个版本的应用程序中,我接受了这个答案,因为它可以工作,但是利用 Android 解决方法的最佳方式始终是在后台发送我们的应用程序.我强烈建议这样做。这将是我的即时应用更新。谢谢大家,尤其是@samgak!
    【解决方案2】:

    public static boolean 添加到您的一个类中,表明应用程序正在退出。当您希望应用程序完成时,在活动 8 中设置此布尔值,并让所有其他活动在其onResume() 中检查它,如果为真,则立即完成。确保第一个活动在完成之前将其清除,否则它可能仍会在应用程序下次运行时设置。 (Android 不一定会在您的最后一个活动完成时丢弃 VM,因此下次可能会重用该类及其静态成员。)

    请注意,这是简单的方式,而不是“Android 方式”。全局变量通常不受欢迎,原因你可以谷歌。执行此操作的“正确”方法是为结果启动每个活动并将结果返回到onActivityResult(...),指示应用程序是否正在退出。

    【讨论】:

    • 我认为这个答案看起来是迄今为止最好的。到目前为止我还没有这样做,我尝试根据这个 - 类似于你 - 代码(SOLUTION-2)stackoverflow.com/questions/8615431/… 来实现它。我会让你知道@Kevin Krumwiede。
    • 我不建议使用这种方式,因为静态在 Android 中有点自己的方式。简而言之 - 可以随时清除静态数据,因此在某些情况下您甚至无法想象或模拟您的应用程序的状态。
    • @Stan 这完全是错误的。静态字段不会“随时”清除。只有当进程被杀死并且JVM被销毁时,静态字段才会被清除。这可能会在应用程序处于后台的任何时候发生,这就是为什么在静态字段中维护应用程序状态是一个坏主意的原因。但实际上更常见的是静态字段在您预期的时候被清除;即,它们在第一个活动开始时仍然设置,因为 Android 重用了上次运行的 JVM。这就是为什么我建议在最后一个活动完成之前明确清除标志。
    • 好的,只要应用在 bg 上,就可以随时清除静态数据,这就是为什么我仍然不建议使用它的原因。这与最终的静态无关。你会看到什么时候会发生错误,因为静电清除了@$$ 确定/检测/修复它的巨大痛苦。您会遇到一些崩溃,并且在大多数情况下您将无法重现它。
    • @Stan 如果一个应用程序在前台,并且你做了一些导致当前活动和后台所有活动立即完成的事情,那么应用程序极不可能(如果不是不可能)进入发生之前的背景。
    【解决方案3】:

    您可以实现一个广播接收器,并让您想要关闭的每个活动在收到广播(将从您的最后一个活动发送)时调用 finish()。我想您需要将广播接收器类设为匿名内部类或活动中的私有类,以便您可以轻松访问封闭活动的完成方法。

    这是广播接收器的一个很好的例子: http://www.tutorialspoint.com/android/android_broadcast_receivers.htm

    查看自定义意图部分。

    这样做是一种松散耦合的方式来实现您想要做的事情。

    【讨论】:

    • backstack 上的 Activity 可能会被销毁,在这种情况下,它们的接收者不会被注册。如果选中“不保留活动”开发人员选项,表现良好的应用程序可以完美运行。
    【解决方案4】:

    在您的意图中使用FLAG_ACTIVITY_CLEAR_TOP 标志,如下例所示。

     Intent intent = new Intent(getApplicationContext(),FirstActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      intent.putExtra("EXIT", true);
      startActivity(intent);
    

    在您的第一个活动中检查以下条件。

    if (getIntent().getBooleanExtra("EXIT", false)) {
    Intent intent = new Intent(Intent.ACTION_MAIN);
                   intent.addCategory(Intent.CATEGORY_HOME);
                   startActivity(intent);
                   finish();
    }
    

    这里的 FLAG_ACTIVITY_CLEAR_TOP 像下面的例子一样工作

    考虑一个由以下活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 并带有解析为活动 B 的组件的 Intent,则 C 和 D 将完成并且 B 接收给定的 Intent ,导致堆栈现在是:A,B。

    所以在这里你必须调用 D 是你的最后一个活动,A 是你的第一个活动。

    【讨论】:

      【解决方案5】:

      这样,您将完成第 8 个 Activity 返回到第 7 个 Activity,同时您就像在设备上模拟按下 Home 按钮一样。当您重新运行您的应用程序时,它会在屏幕上显示第 7 个活动。如果您希望在这种情况下查看第 8 个活动,则只需删除 finish() 方法。如果您希望下次您的应用程序从第一个 Activity 开始,那么您应该完成从 8 到 2 的所有 Activity,而不是第 1 个。您还可以添加 FLAG NEW_TASK 或其他一些标志来启动您的第一个活动。
      更新
      我的建议(为了在不改变工作流程的情况下获得快速结果)是使用startActivityForResult() 来启动链中的所有活动。当用户退出应用程序时,只需使用setActivityResult() 返回一个特殊参数,以让所有嵌套活动了解用户的选择,使所有嵌套活动都运行finish()。这样你的 8 项活动都会正常完成。

      【讨论】:

      • 我不想完成从第 8 次到第 2 次离开第一个 Activity 的所有活动,因为我的应用程序消耗资源,这样它不会退出,但它会永久消耗越来越多的 RAM。我只想退出应用程序并从第一个 Activity 重新运行它。
      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2020-01-27
      • 2013-01-13
      • 2021-08-07
      • 2019-08-12
      相关资源
      最近更新 更多