退出Android应用程序的最佳方法?

问题描述:

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

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

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

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

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

+0

也许'系统'类可以帮助(或Android等效)? (我不熟悉android编程) – 11684 2012-03-02 11:21:49

+2

请阅读[this](http://*.com/questions/2033914/quitting-an-application-is-that-frowned-upon) – Ghost 2012-03-02 11:26:22

+1

“我有一个自定义的流程这迫使我实现这个“ - 这是你的应用程序中的一个错误。请修复您的应用程序中的错误。 – CommonsWare 2012-03-02 13:26:42

你不应该这样做,但是反正如果你坚持:

System.exit(0); 
+0

这也是我找到的一种方式,忘了提及它。但是这个问题是,当我再次打开我的应用程序时,它会重新创建我关闭应用程序时打开的活动。 – Arne517 2012-03-02 11:38:22

使用下面的代码。

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

我真的很需要这样做(Android的早期版本带有OpenGL资源泄漏漏洞,所以我不得不在两次调用之间关闭应用程序来强制Android清理)。我通过使用'android:process =“foo”'强制这个活动进入它自己的进程,以避免在进程死亡时终止其他活动并使用上述代码。它实际上工作。 – 2012-03-02 11:38:26

+0

这将打开所有打开的活动onDestroy?也不会停止我的运行服务? – Arne517 2012-03-02 11:38:46

+0

在这个过程中实例化的所有活动和服务将会消失,就好像Android由于内存不足而固化了进程。这就是为什么你需要使用'android:process',这样你就不想在不同的过程中杀死任何人。 – 2012-03-02 11:40:02

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

+2

没有生产代码应该使用'killProcess()'。 – CommonsWare 2012-03-02 13:27:44

+0

我只是试过这个,但是当我有很多开放的活动(那些android会销毁它们,当我重新访问它们时重新创建它们),这种方法不起作用。它仍然会重新创建这些活动。 – Arne517 2012-03-02 13:44:50

+0

@ Arne517这就是为什么你应该先完成所有的活动,然后调用killProcess。如果你先完成他们,他们将不会被重新创建 – 2012-03-02 14:12:52

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

根据我的最佳解决方案是完成您的应用程序中的每个活动,如下所示。

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

public static isQuit = false; 

step2)点击一个按钮的事件使这个变量为真。

mainactivity.isQuit = true; 

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

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