2

我知道不建议在 Android 应用程序中使用 system.exit(0),但我想知道在 onDestroy() 中使用它是否可以,因为此时允许应用程序被杀死?

我问的原因与这个问题有关。

4

4 回答 4

4
  • 不要依赖onDestroy会被调用。在某些情况下,操作系统会在不调用您的onDestroy.

当然,这只是一个建议,因为它并不直接适用于您的场景。如果system.exit(0)因为应用程序已经被杀死而没有被调用,我会说你没事。;-)

  • 如果您Activity.onDestroy被调用,则意味着您的进程处于以下两种状态之一:

--操作系统知道的应用程序中没有运行其他组件(Service或 a )。ContentProvider这意味着无论如何,您的进程很可能会立即被操作系统杀死,或者如果系统的其他部分/其他应用程序需要物理内存,则将是第一个被回收的进程。因此调用exit(0)不会有太大的作用。

-- 系统知道在您的进程中运行的另一个组件。在这种情况下调用exit()会终止进程,杀死您的其他组件并可能损坏您的数据。当然,操作系统可能不太关心,但您的用户可能不喜欢它。:-)

  • 如果其他应用程序已经用尽了内部 Dalvik 堆限制,那么自愿终止您的进程将无济于事。无论设备有多少物理内存,操作系统都会限制 Dalvik 在任何进程中用于堆分配的内存量。因此,系统可能有一半的内存可用,并且特定应用程序仍然会遇到 OOM。

Dalvik 堆限制是 OEM 可配置的,尽管很少有 OEM 确实努力为他们的设备调整它,并且只使用操作系统默认值。我不记得具体的默认值,但可以肯定地假设每个应用程序允许在低端 Froyo/Gingerbread 上的 16MB 和高端 ICS/JB 手机上的 48MB 之间。哎呀,我会很乐观,将上限提高到 128MB(尽管我还没有听说过这样的设备)。:-)

  • 如果您的应用程序的内存使用存在问题(由链接的问题暗示),并且您试图通过在下一次打开活动时强制“干净”平板来解决它,那么这种方法将起作用。有点儿。但只要您的应用程序仅使用活动,它就可以工作。ContentProvider在你输入 a或 a的那一刻Service,你不能再打电话exit()了(正如我上面提到的),你将被迫正确地解决问题。你还不如硬着头皮现在就去做。最简单的方法是确保Bitmap.recycle()在完成特定位图后调用。当然,只要您不必在内存中保留比您的内存更多的位图,它就可以工作,但无论如何,这完全是一个完全独立的野兽。:-)
于 2012-12-30T17:19:51.357 回答
3

你不应该调用 sytem.exit(0),让 android 管理应用程序。如果我了解您有内存泄漏问题。我猜是因为位图。所以看看这个有效地显示位图http://developer.android.com/training/displaying-bitmaps/index.html

如果您在 onDestroy() 方法中调用 system.exit(0),您将无法在横向和纵向之间切换。

于 2012-12-30T17:14:03.070 回答
1

捷径解决方案:当您完成应用程序时,在活动上调用 finish() 而不是 System.exit(0)。

正确的方法是优化应用程序中的位图使用。看到这个
http://developer.android.com/training/displaying-bitmaps/index.html

于 2012-12-30T17:36:54.930 回答
0

您可能最好看一下以下选项:http: //developer.android.com/reference/android/app/Application.html#onLowMemory%28%29

于 2012-12-30T17:17:18.117 回答