在onDestroy()中使用system.exit(0)(Android)

时间:2012-12-30 16:55:49

标签: android android-lifecycle

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

我提出的原因与this问题有关。

4 个答案:

答案 0 :(得分:4)

  • 不要依赖于onDestroy。在某些情况下,操作系统会在不调用onDestroy的情况下终止您的应用程序。

当然,只是一句建议,因为它不直接适用于您的方案。如果由于应用程序已被杀死而未调用system.exit(0),我会说你没问题。 ; - )

  • 如果您的Activity.onDestroy被调用,则表示您的流程处于以下两种状态之一:

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

- 您的流程中还有另一个系统可以识别的组件。在这种情况下调用exit()将终止该进程,从而终止您的其他组件并可能损坏您的数据。操作系统当然可以少关注,但您的用户可能不会欣赏它。 : - )

  • 如果他们已经用尽了他们内部的Dalvik堆限制,那么您自愿杀死您的流程将无法帮助其他应用程序。无论设备有多少物理内存,操作系统都限制Dalvik允许在堆分配的任何进程中使用多少内存。因此,系统可能有一半的内存,特定的应用程序仍然可以访问OOM。

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

  • 如果您的应用程序的内存使用存在问题(链接问题隐含),并且您试图通过在下一次打开活动时强制“清理”一下来解决它,则此方法可行。的种类。但只要您的应用程序仅使用活动,它就会起作用。你扔进ContentProviderService的那一刻,你再也不能打电话给exit()了(正如我上面提到的那样),你将被迫正确地解决问题。你可能只是咬紧牙关并立即行动。最简单的方法是确保在完成特定位图时调用Bitmap.recycle()。当然,只要你不必在内存中保留比你有记忆更多的位图,这就行了,但无论如何,这完全是一个完全独立的野兽。 : - )

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

快捷解决方案:完成应用后,请在活动时调用finish()而不是System.exit(0)。

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

答案 3 :(得分:0)