本讲讲解onSaveInstanceState与onRestoreInstanceState的使用。
2.视频讲解
http://www.eyeandroid.com/thread-11391-1-1.html
3.翻译参考
存在一些情况,由于普通的程序行为,你的activity会被销毁,比如,当用户点击Back按钮,或者自己调用finish()方法。另外,如果activity被停止了并且很久没被使用,或者前台的系统需要更多的资源,系统也可能会销毁你的activity。
当你的activity开始停止,系统就调用onSaveInstanceState(),你可以在这个函数中使用key-value对的集合保存信息。默认函数实现了保存activity的view状态,比如EditText的文本,或者ListView的滚动条位置。
- static final String STATE_SCORE = "playerScore";
- static final String STATE_LEVEL = "playerLevel";
- ...
- @Override
- public void onSaveInstanceState(Bundle savedInstanceState) {
- // 保存用户当前游戏状态
- savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
- savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
- // 通常调用父类,让他能保存View的信息。
- super.onSaveInstanceState(savedInstanceState);
- }
警告:通常需要在onSaveInstanceState()实现中调用它的父类方法,以便能够实现保存view的信息。
如果你的activity在它被销毁后重启,你可以从系统传递给你的Bundle中恢复保存的状态,onCreate()和onRestoreInstanceState()都可以接受到相同的包含实例状态信息的Bundle。
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState); // Always call the superclass first
- // 检查是否是一个前面销毁的activity实例。
- if (savedInstanceState != null) {
- // 恢复玩家状态
- mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
- mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
- } else {
- // 为新实例初始化一个默认值
- }
- ...
- }
你也可以选择在onRestoreInstranceState()方法中实现,当系统调用完onStart()函数后会调用onRestoreInstranceState(),不过仅仅是当有状态需要恢复时才会调用,所以你不需要检查Bundle是否为空:
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- // 调用父类恢复默认的View的状态
- super.onRestoreInstanceState(savedInstanceState);
- // 恢复玩家状态
- mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
- mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
- }
警告: 通常需要调用onRestoreInstanceState()的父类方法,以便能恢复默认的视图状态。
1249



被折叠的 条评论
为什么被折叠?



