退出Android应用程序的最佳方法?
我正在寻找一种方法来通过代码退出我的android应用程序。 是的,我知道,我不应该这样做,因为当你按下后退按钮时,android会处理它,但是我有一个自定义的流程,迫使我执行此操作。我已经搜索了一段时间,并找到了多个答案:退出Android应用程序的最佳方法?
- 不应该这样做=>没有选项。
- 在我的活动中调用finish()=>仅针对1个活动,而不是整个应用程序。
- 用特殊标志=>开始一个Intent到第一个活动我拥有多个入口点,所以不是一个真正的选项。
- 只要杀死我自己的进程=>不知道这一个,这会在所有活动中调用onDestroy()方法吗?我的后台服务会继续运行吗? (不应该停止)
所以我想知道,是否有任何其他选项退出我的应用程序,或者我真的只限于这些选项? 如果确实没有其他选项,那么我正在考虑在我的Application类中创建所有活动实例的列表,然后循环它们以调用finish()。但我不知道这是否是解决这个问题的正确方法。
所以这就是为什么我在这里问我的问题,这是关闭我的应用程序的最佳方式?
编辑:我或多或少地修复了这个问题。我有我的活动的WeakReference列表。在每一个onCreate中,我都将活动添加到列表中。然后,当我想退出我的应用时,我只是循环列表并调用finish()。问题是:如果列表变得太大,它不会完成我所有的活动,因为android已经销毁了它们。所以每当我知道我不再需要它们时,我就完成它们。就我而言,这个列表不能超过3/4个活动,因此不需要再担心活动没有完成。同样用这种方法,我不必破坏我自己的过程。
你不应该这样做,但是反正如果你坚持:
System.exit(0);
这也是我找到的一种方式,忘了提及它。但是这个问题是,当我再次打开我的应用程序时,它会重新创建我关闭应用程序时打开的活动。 – Arne517 2012-03-02 11:38:22
使用下面的代码。
android.os.Process.killProcess(android.os.Process.myPid());
System.runFinalizersOnExit(true);
我真的很需要这样做(Android的早期版本带有OpenGL资源泄漏漏洞,所以我不得不在两次调用之间关闭应用程序来强制Android清理)。我通过使用'android:process =“foo”'强制这个活动进入它自己的进程,以避免在进程死亡时终止其他活动并使用上述代码。它实际上工作。 – 2012-03-02 11:38:26
这将打开所有打开的活动onDestroy?也不会停止我的运行服务? – Arne517 2012-03-02 11:38:46
在这个过程中实例化的所有活动和服务将会消失,就好像Android由于内存不足而固化了进程。这就是为什么你需要使用'android:process',这样你就不想在不同的过程中杀死任何人。 – 2012-03-02 11:40:02
您可以在列表中保留所有已启动活动的列表(使用WeakReference来避免内存泄漏)。要退出应用程序,首先调用每个项目的finish方法,然后调用android.os.Process.killProcess(android.os.Process.myPid());
没有生产代码应该使用'killProcess()'。 – CommonsWare 2012-03-02 13:27:44
我只是试过这个,但是当我有很多开放的活动(那些android会销毁它们,当我重新访问它们时重新创建它们),这种方法不起作用。它仍然会重新创建这些活动。 – Arne517 2012-03-02 13:44:50
@ 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();
}
也许'系统'类可以帮助(或Android等效)? (我不熟悉android编程) – 11684 2012-03-02 11:21:49
请阅读[this](http://*.com/questions/2033914/quitting-an-application-is-that-frowned-upon) – Ghost 2012-03-02 11:26:22
“我有一个自定义的流程这迫使我实现这个“ - 这是你的应用程序中的一个错误。请修复您的应用程序中的错误。 – CommonsWare 2012-03-02 13:26:42