android - 无法得到通过onSaveInstanceState()保存的Bundle数据
PHPz
PHPz 2017-04-17 11:58:20
[Android讨论组]

在一个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);
        }
    }
}
PHPz
PHPz

学习是最好的投资!

全部回复(2)
巴扎黑

我想这不是你代码的问题,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.

阿神

onSaveInstanceState不是activity的生命周期函数,仅针对“异常退出”,即当系统“未经你许可”时销毁了你的activity。
场景有:
1、按HOME键
2、长按HOME键,选择运行其他的程序
3、按下电源按键(关闭屏幕显示)时
4、从activity A中启动一个新的activity时
5、屏幕方向切换时,例如从竖屏切换到横屏时。

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号