android - 无法得到通过onSaveInstanceState()保存的Bundle数据

 Le-麦兜_738 发布于 2022-11-04 23:37

在一个EditText输入框中输入字符,activity被destroy之前通过onSaveInstanceState()保存输入字符,当重新create这个activity时,onCreate(Bundle)的Bundle参数却是null,不清楚问题出在哪?activity的代码如下:

package com.example.TestSaveInstanceState;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.widget.EditText;

public class MyActivity extends Activity {

    static final String STATE_KEY = "etInputState";
    EditText etInput;
    static final String MYTAG = "mytag";

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        etInput = (EditText)findViewById(R.id.etInput);
        if(savedInstanceState != null) {
            Log.w(MYTAG, savedInstanceState.getString(STATE_KEY));
            etInput.setText(savedInstanceState.getString(STATE_KEY));
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String _s = etInput.getText().toString();
        if(_s != null) {
            outState.putString(STATE_KEY, _s);
            Log.w(MYTAG, "instance state = " + _s);
        }
    }
}
2 个回答
  • onSaveInstanceState不是activity的生命周期函数,仅针对“异常退出”,即当系统“未经你许可”时销毁了你的activity。
    场景有:
    1、按HOME键
    2、长按HOME键,选择运行其他的程序
    3、按下电源按键(关闭屏幕显示)时
    4、从activity A中启动一个新的activity时
    5、屏幕方向切换时,例如从竖屏切换到横屏时。

    而正常的BACK建退出,只会调用onPause()。所以,最好在onPause()里处理保存数据。另外,耗时的操作,像写数据库到flash,要延迟到onStop(),否则会引起页面切换卡顿。

    2022-11-08 23:32 回答
  • 我想这不是你代码的问题,onSaveInstanceState()是在系统需要recreate这个Activity的时候才会去调用他,比如屏幕由竖屏切换到横屏,改变了语言等,而不是人为地finish/create一个Activity,如果你想达到你想要的目的,要在onPause方法中保存当前Activity中的状态。这是官方文档的解释:To save additional data about the activity state, you must override the onSaveInstanceState() callback method. The system calls this method when the user is leaving your activity and passes it the Bundle object that will be saved in the event that your activity is destroyed unexpectedly. If the system must recreate the activity instance later, it passes the same Bundle object to both the onRestoreInstanceState() and onCreate() methods.

    2022-11-08 23:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有