【问题标题】:Best way to quit android app?退出Android应用程序的最佳方法?
【发布时间】:2012-03-20 21:41:13
【问题描述】:

我正在寻找一种通过代码退出我的 android 应用程序的方法。 是的,我知道,我不应该这样做,因为当您按下后退按钮时,android 会处理它,但我有一个自定义流程迫使我实现这一点。我已经搜索了一段时间,找到了多个答案:

  • 不应该这样做 => 没有选择。
  • 在我的活动中调用 finish() => 仅针对 1 个活动,而不是整个应用。
  • 使用特殊标志启动第一个活动的 Intent => 我有多个入口点,所以不是一个真正的选择。
  • 杀死我自己的进程 => 不确定这个,它会在所有活动中调用 onDestroy() 方法吗?我的后台服务会继续运行吗? (不应停止)

所以我想知道,是否有任何其他选项可以退出我的应用程序,或者我真的仅限于这些选项? 如果真的没有其他选择,那么我正在考虑在我的 Application 类中创建我的活动的所有实例的列表,然后循环它们以在它们上调用 finish() 。但我不知道这是否是处理这个问题的正确方法。

这就是为什么我在这里问我的问题,关闭我的应用程序的最佳方法是什么?

编辑:我或多或少地解决了这个问题。我有一个我的活动的弱引用列表。在每个 onCreate 中,我将活动添加到列表中。然后,当我想退出我的应用程序时,我只需循环列表并调用 finish()。问题是:如果列表太大,它不会完成我所有的活动,因为 android 已经摧毁了它们。所以每次我确定我不再需要它们时,我都会完成它们。就我而言,列表不能超过 3/4 的活动,因此无需再担心活动未完成。同样使用这种方法,我不必破坏自己的进程。

【问题讨论】:

  • System 类可能会有所帮助(或 Android 等价物)? (我对android编程不熟悉)
  • 请阅读this
  • “我有一个定制的流程,迫使我实现这个”——这是你的应用程序中的一个错误。请修复您应用中的错误。
  • 嗯,这不是一个真正的错误。在浏览应用程序时,有一段时间当用户按下后退按钮时,他会期望应用程序关闭(但不是每次都关闭)。但是当我调用finish() 时,会显示“旧”活动。这些也必须关闭。所以也许你会说,当我开始一个新的活动时,我应该完成这些活动。但是当我开始一个新的活动时,我还不知道用户是否能够返回到当前活动。我知道,这听起来很复杂 :) 但关闭应用程序真的很有意义。
  • 好吧,我可以通过更改我的流程设置来“修复设计错误”。但这需要我扩充主要活动中的每个活动,并自己处理历史。我只是认为这不是正确的方法。想想一个选项卡式应用程序:当您打开一个选项卡时,它会启动一个新活动,但当您按下返回时,它会关闭。选项卡式活动也可以打开另一个活动,当您按回时,它不会关闭。除此之外,在非选项卡活动中,将有一种“显示选项卡”的方法。这将导致用户认为他回到了起点,而实际上并没有。

标签: android quit


【解决方案1】:

你不应该这样做,但无论如何,如果你坚持:

System.exit(0);

【讨论】:

  • 这也是我找到的一种方式,忘记提了。但是这个问题是,当我再次打开我的应用程序时,它会重新创建我关闭应用程序时打开的活动。
【解决方案2】:

使用下面的代码。

android.os.Process.killProcess(android.os.Process.myPid());
    System.runFinalizersOnExit(true);

【讨论】:

  • 我非常需要这样做(早期版本的 Android 存在 OpenGL 资源泄漏错误,因此我不得不在两次调用之间关闭应用程序以强制 Android 进行清理)。我通过使用android:process="foo"将这个活动强制到自己的进程中来做到这一点,以避免在进程死亡时杀死其他活动,并使用上面的代码。它确实有效。
  • 这会在所有打开的活动上调用 onDestroy 吗?这也不会停止我正在运行的服务吗?
  • 进程中实例化的所有活动和服务都将消失,就像Android由于内存不足而对进程进行了核对一样。这就是您需要使用android:process 的原因,这样您不想 想要杀死的任何东西都存在于不同的进程中。
【解决方案3】:

不推荐,但您仍然可以使用它。如果您需要退出应用程序,最好使用此解决方案。

在我看来,最好的解决方案是完成您应用中的所有活动,如下所示。

step1) 在 mainactivity 中维护一个静态变量。

public static isQuit = false;

step2) 在按钮的点击事件中将此变量设为 true。

 mainactivity.isQuit = true;

step3) 并且在您的应用程序的每个活动中都有如下 onrestart 方法..

 @Override
      protected void onRestart() {
         // TODO Auto-generated method stub
         super.onRestart();
        if(mainactivity.isQuit)
            finish();
    }

【讨论】:

    【解决方案4】:

    您可以在 List 中保留所有已启动活动的列表(使用 Wea​​kReference 以避免内存泄漏)。要退出应用程序,首先在每个项目上调用完成方法,然后调用 android.os.Process.killProcess(android.os.Process.myPid());

    【讨论】:

    • 我刚试过这个,但是当我有很多打开的活动时(android会破坏它们,并在我重新访问它们时重新创建它们),这种方法不起作用。它仍然会重新创建这些活动。
    • @Arne517 这就是为什么你应该先完成所有活动然后调用killProcess。如果你先完成它们,它们将不会被重新创建
    • @solilo:“我不知道为什么它不适合调用 killProcess”——因为核心 Android 团队告诉你不要这样做。 “有时你必须”——不,你不需要。 “我的意思是应用程序旨在退出某些活动,那么你应该让它发生” - 这是一个有缺陷的设计。接下来,您会说 Web 应用程序应该导致浏览器崩溃,因为一些设计师说必须有一种方法可以“退出”Web 应用程序。用户完全可以按下 HOME 按钮、调出最近的任务或以其他方式离开您的应用程序。
    • @CommonsWare 就我个人而言,我不喜欢使用 HOME 按钮来“退出”应用程序。我更喜欢像我通常在 windows/linux 中所做的那样“关闭”它。用户不知道应用程序“崩溃”或只是被带到后台,如果他们无法区分,我认为这样做是可以的。关于核心 Android 团队,我希望他们能帮助我处理与 PM..
    • @CommonsWare 我尝试了 moveTaskToBack,但是,如果再次单击应用程序图标,旧的活动将被带到前台,但我需要像第一次打开一样打开新的启动活动跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2014-11-29
    相关资源
    最近更新 更多