在调用onDestroy()方法后,Activity实例是否真的被销毁?

时间:2014-11-17 21:24:19

标签: android android-activity activity-lifecycle

我在学习 savedInstanceState Bundle时感到困惑。我发现调用 onDestroy()方法后不会销毁Activity实例,或者它可以在没有 savedInstanceState Bundle帮助的情况下保存数据。

这是我的测试代码:

package com.example.hellotest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private static int testNum = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main);
        testNum++;
        Log.d(TAG, "testNum: " + testNum);
        if(savedInstanceState == null)
            Log.d(TAG, "savedInstanceState is null");
        else
            Log.d(TAG, "savedInstanceState is NOT null");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

这是日志信息:

11-17 22:10:14.433: D/MainActivity(23303): onCreate
11-17 22:10:14.463: D/MainActivity(23303): testNum: 1
11-17 22:10:14.463: D/MainActivity(23303): savedInstanceState is null
11-17 22:10:17.527: D/MainActivity(23303): onDestroy
11-17 22:10:18.278: D/MainActivity(23303): onCreate
11-17 22:10:18.298: D/MainActivity(23303): testNum: 2
11-17 22:10:18.298: D/MainActivity(23303): savedInstanceState is null
11-17 22:10:19.569: D/MainActivity(23303): onDestroy
11-17 22:10:20.200: D/MainActivity(23303): onCreate
11-17 22:10:20.220: D/MainActivity(23303): testNum: 3
11-17 22:10:20.220: D/MainActivity(23303): savedInstanceState is null

testNum 永远不会返回1,除非我完全杀死手机上的进程,在我看来,Activity实例并没有真正被破坏,所以我们不需要覆盖 onSaveInstanceState(Bundle outState)保存数据的方法。

是否存在我误解的地方?

2 个答案:

答案 0 :(得分:3)

testNum被声明为static,因此与类MainActivity相关联,而不是与其任何特定实例相关联。除非您需要静态访问testNum,否则应删除static标识符:

private int testNum = 0;

执行此操作将导致testNumMainActivity类的实例关联,并且确实会被销毁。

如果您选择,您可以覆盖onSaveInstanceState以在旋转期间维护实例变量,或者如果MainActivity被销毁并重新创建以用于任何其他配置更改:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("testNum", testNum);
}

答案 1 :(得分:0)

混淆在静态变量和实例变量之间。

您的计数器是静态的,因此它具有您的过程的生命周期,而不是任何特定的实例。

由于无法保证流程生命周期,您通常不希望存储任何无法在那里轻易重新创建的内容。