Android 如果无法保证调用onDestroy,如何清理应用程序状态

Android 如果无法保证调用onDestroy,如何清理应用程序状态,android,Android,我只是注意到,当活动被销毁时,并不总是调用活动的onDestroy。我读了安卓文档,确实如此。我想到的一件事是,当这种强制杀戮发生时,我们如何确保应用程序状态是干净的?考虑这个愚蠢的代码: 公共类MainActivity扩展了AppCompatActivity{ byte[] bytes = new byte[1024 * 1024 * 100]; MyThread thread; class MyThread extends Thread { Activity activity;

我只是注意到,当活动被销毁时,并不总是调用活动的onDestroy。我读了安卓文档,确实如此。我想到的一件事是,当这种强制杀戮发生时,我们如何确保应用程序状态是干净的?考虑这个愚蠢的代码:

公共类MainActivity扩展了AppCompatActivity{

byte[] bytes = new byte[1024 * 1024 * 100];
MyThread thread;

class MyThread extends Thread {

    Activity activity;

    @Override
    public void run() {
        activity = MainActivity.this;
        try {
            Thread.sleep(200000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startService(new Intent(this, LongRunningService.class));
    thread = new MyThread();
    thread.start();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    thread.activity = null;
    Log.e("Test", "onDestroy called");
}
}


如果不能保证调用onDestroy,那么显然会出现严重的内存泄漏。我们如何处理这种清理?

如果您的应用程序被强制终止,进程将停止,内存将被回收。这不是内存泄漏

然而,一般来说,这都是关于谁保留对事物的引用。如果仅在活动的实例字段中保留对事物的引用,则当活动变为未引用时,它们将变为未引用。问题解决了


在您的代码中,如果线程不能保证退出,那么让
线程
保留活动引用确实是一种潜在的内存泄漏。您应该使用弱引用,或者基于应用程序上下文而不是活动上下文。

如果您的应用程序被强制终止,则进程将停止,内存将被回收。这不是内存泄漏

然而,一般来说,这都是关于谁保留对事物的引用。如果仅在活动的实例字段中保留对事物的引用,则当活动变为未引用时,它们将变为未引用。问题解决了


在您的代码中,如果线程不能保证退出,那么让
线程
保留活动引用确实是一种潜在的内存泄漏。您应该使用弱引用,或者基于应用程序上下文而不是活动上下文。

onPause()
总是被调用,是“保存”内容的好地方。如果您使用的是
AsyncTask
而不是
线程
,那么您可以在
onPause
期间取消
AsyncTask
,这也可以让您做得更多。
onPause()
总是被调用,是“保存”内容的好地方。如果您使用的是
AsyncTask
而不是
线程
,则可以在
onPause
期间取消
AsyncTask
,这也可以让您做得更多。谢谢。说明是否有包含活动和前台服务的应用程序。是否可能已终止活动,但未终止服务?或者android只会在每个进程的基础上称赞资源?我知道我提供的代码很愚蠢,只是一个极端的例子。更普遍的问题是,在这些强制杀戮的情况下,如何清理应用程序状态并持久化数据?或者我们根本不需要考虑它?它有可能被破坏(它是'nDebug())方法,而不是服务的<代码> OnDebug()/<代码>方法。如果“kill”是指unix进程被终止,那么不是,除非您指定活动和服务在不同的进程中运行(这不是默认值)。谢谢。说明是否有包含活动和前台服务的应用程序。是否可能已终止活动,但未终止服务?或者android只会在每个进程的基础上称赞资源?我知道我提供的代码很愚蠢,只是一个极端的例子。更普遍的问题是,在这些强制杀戮的情况下,如何清理应用程序状态并持久化数据?或者我们根本不需要考虑它?它有可能被破坏(它是'nDebug())方法,而不是服务的<代码> OnDebug()/<代码>方法。如果“kill”是指unix进程被终止,那么不是,除非您指定活动和服务在不同的进程中运行(这不是默认值)。