28

我有一个活动,我调用了 finish() 方法,并且该活动没有从内存中清除。

调用 finish() 后,我看到方法 onDestroy() 已成功执行(并且我清除了其中的所有变量和内容)。

应该从内存中清除它还是它是如何工作的?据我了解,活动的生命周期已经完成。

如果它将应用程序保留在内存中,以便用户第二次使用它时运行得更快,我可以将哪些对象留在内存中以重复使用?如果我理解正确,我想清除 onDestroy 上的所有内容。

4

7 回答 7

35

如果用户想要重新启动应用程序,Android 会保留进程,这使得启动阶段更快。该进程将不会做任何事情,如果需要回收内存,该进程将被终止。别担心 :)

于 2009-12-30T23:05:13.300 回答
30

最好的方法是先使用finish(),然后使用System.exit(0)清除静态变量。它会给你一些自由空间。

许多应用程序留下了让我生气的工作流程和变量。使用 30 分钟后内存已满,我必须运行任务管理器 - Lvl 2 清除内存

我在我的应用程序中尝试了超过 3 年的问题是不正确的。使用后永远不会崩溃或重新启动Exit()

于 2012-08-19T18:43:42.723 回答
12

尝试使用

System.exit(0);

于 2010-05-19T15:03:10.163 回答
6

一旦 onDestroy() 被调用,你的活动就注定了。时期。

话虽如此,分配给您的应用程序的进程(以及因此的地址空间)可能仍在由您的应用程序的另一部分使用 - 另一个活动或服务。您的进程也可能是空的,而操作系统还没有回收它;这不是即时的。

有关更多信息,请参阅流程生命周期文档:http:
//developer.android.com/reference/android/app/Activity.html#ProcessLifecycle

无论如何,如果您的 Activity 重新启动,它必须再次经历整个启动序列,从 onCreate() 开始。不要假设任何东西都可以隐式重用。

于 2009-12-29T23:21:26.910 回答
4

If you need to close application from subactivity, I may suggest you to made it in such a way: 1) from activity A call activity B as startActivityForResult(intent, REQUEST_CODE);

Intent intent = new Intent()
            .setClass(ActivityA.this, ActivityB.class);
            startActivityForResult(intent, REQUEST_CODE);

2) in activity A you should add method:

protected void onActivityResult(int requestCode, int resultCode,
        Intent data) {
    if (requestCode == REQUEST_CODE) {
        if (resultCode == RESULT_CLOSE_APPLICATION) {
            this.finish();
        }
    }
}

3) in activity B call finish:

this.setResult(RESULT_CLOSE_APPLICATION);
this.finish();
于 2011-03-16T18:48:28.517 回答
1

作为快速修复,您可以使用以下方法杀死您的应用程序:

android.os.Process.killProcess(android.os.Process.myPid());

但我不建议将其用于商业应用程序,因为它违背了 Android 内存管理系统的工作方式。

于 2012-01-12T10:36:29.387 回答
1

根据Google I/O 2008的这个演示文稿,Finish 也应该导致进程被终止,但我编写了一个快速应用程序来测试这一点,而在 Android 1.5 上却没有。

正如 Romain 所说(顺便说一句,他是 Android 的 UI Toolkit 工程师),您的进程无论如何都会坐在那里无所事事,因此无需担心。

于 2010-02-11T15:21:13.367 回答