当前位置: 首页 > 知识库问答 >
问题:

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

司空鸿熙
2023-03-14

我在学习保存的InstanceState捆绑包时感到困惑。我发现,在调用onDestroy()方法后,活动实例没有被销毁,或者它可以在没有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,在我看来,活动实例并没有真正被销毁,所以我们不需要重写onSaveInstanceState(Bundle outState)方法来保存数据。

有什么地方是我误解的吗?

共有1个答案

尹英华
2023-03-14

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);
}
 类似资料:
  • 我有两个活动(A1,A2)。A1呼叫A2,从A2我呼叫摄像机意图如下 它打开相机,我就可以拍照了。但是问题出现了,一旦我单击save按钮(s3中的勾选按钮),我的onActivityResult就不会被调用,而是A2的onDestroy方法被调用。我在onActivityResult fn中有一些逻辑需要完成。 我在Stackoverflow上读过一些关于这个的帖子,但我无法从中得到有用的输出。我

  • 我在活动的中放置了一些缓存清理代码,但大多数情况下,除非通过显式地完成活动,否则这些代码不会执行。 编辑:只读仅在或系统资源不足时调用。那么我需要把我的缓存清理代码放在哪里呢?如果我把它放在中,用户返回到应用程序,缓存就会被清除。我实际上是在缓存中存储重要的临时文件,这些文件不应该在中删除。

  • 问题内容: 你们有以下问题的解决方法吗? 在注册活动的onDestroy中(当用户按下后退按钮时),我调用一个新活动,以便用户可以输入当天的某些最终生产数据,然后通过电子邮件发送该报告。问题在于,在刚刚开始的活动中,对getIntent的调用返回null,而我必须从那里获取数据。 ================================================== ========

  • 本文向大家介绍Python用access判断文件是否被占用的实例方法,包括了Python用access判断文件是否被占用的实例方法的使用技巧和注意事项,需要的朋友参考一下 有的小伙伴想知道用access()函数可以判断一个文件被占用吗?理论上来说是不行的,access()返回的是文件的读写属性。为了让小伙伴们信服,小编进行了简单的测试。 可见,os.access()返回的是文件读写属性,与文件是否

  • 我试图理解在另一个类中完成一个过程后,如何在我的活动中调用一个方法? 请看我的插图例子。在MyActivity中,我想在MyClass中调用一个名为DoSomething的当doSomething完成后,我希望MyClass(通知?、接口?、委托?、可观察?、插入“我不知道这里”)我完成的方法回到活动状态。 我看过接口。但我不明白重点。(您基本上promise实现一个方法?但是...为什么?您可以

  • 问题内容: 一个简单的问题:您确定可以致电吗?我没有找到任何确认。 问题答案: 一个简单的问题:您可以确定finish()将调用onDestroy()吗? 首先,此答案假定您正在引用Android的类及其方法和生命周期方法。 其次,这取决于您对“确定”的定义: 您的流程可能在和之间终止,原因与触发调用的原因无关 设备制造商或ROM修改器可能会引入一些螺钉更改,从而破坏与 电池可能在和之间耗尽 等等