关于Activity保存状态的研究

2023-05-17,,

 一.Activity进行横竖屏切换时候的生命周期

1.运行的时候

 

2.切横屏(生命周期执行一次)

 

3.再切竖屏(生命周期执行两次)

 

重写返回按钮事件public void onBackPressed()此方法当返回按钮事件出发时,体系会默许调用finish(),你直接return别让体系调用就行,back键后台参考源码home的事件并重写

@Override
public void onBackPressed() {
// 这里处理逻辑代码,该方法仅适用于2.0或更新版的sdk
return;
}

android的手机的back键默认行为是finish实质就是从Task中将其出栈处于前台的Activity的即Activity的状态为Destroy状态,再次启动该Activity是从onCreate开始的。 而Home键默认是stop前台的Activity即状态为onStop而不是Destroy,若再次启动它,则是从OnResume开始的,即会保持上次Activityd的状态。 back键也有例外的,按back键不会关闭Activity的,比如播放音乐,按back键之后仍可以继续播放音

按下Back返回键

 

按下Home

按下Home键后再次运行改程序

如果将activityandroidconfigChanges=orientation|keyboardHidden属性设置后

1, 同上1

2, 

3, 

总结

1.Activity在进行横屏切换时会生命周期会执行一次,这个生命周期不是正常所说的连贯的生命周期,会先调用onSaveInstanceState()方法,在这里可以进行Activity的状态保存,然后是onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()->onRestoreInstanceState()->onRsume();

进行竖屏切换时会调用2次,

2.如果在Manifest.xml中设置了Activity的属性android:configChanges=orientation|keyboardHidden,则进行横屏切换的时候只会调用一次onConfigurationChanged()方法,竖屏会调用两次

按下Home键,onSaveInstanceState()-> onPause()->onStop();此时运行别的程序,如果没被收回内存,再运行该程序

onRestart()->onStart()->onResume()

Activity未被完全覆盖只是失去焦点:onPause--->onResume

二.Activity的状态保存

方法一:通过onSaveInstanceState() onRestoreInstanceState()onCreate()

Back键不会调用onSaveInstanceState,只有在Home键,横竖屏切换和系统收回Activity的时候才会调用,

onSaveInstanceState的调用遵循一个重要原则,即当系统未经你许可时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据至于onRestoreInstanceState方法,需要注意的是onSaveInstanceState方法和onRestoreInstanceState方法不一定是成对的被调用的onRestoreInstanceState被调用的前提是,activity A“确实被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity AonRestoreInstanceState方法不会被执

一.关键字:通过参数Bundle 来进行存储

onCreate(Bundle savedInstanceState)onRestoreInstanceState(Bundle savedInstanceStae)都可以进行数据的恢复,

从图中,我们可以看出,onCreate()方法运行在onRestoreInstanceState()方法之前。


  1. @Override 
  2. protected void onSaveInstanceState(Bundle outState) { 
  3. // TODO Auto-generated method stub 
  4. super.onSaveInstanceState(outState); 
  5. Log.i(TAG, "onSaveInstanceState"); 
  6. String content = editText.getText().toString(); 
  7. if (null != content) { 
  8. outState.putString(TAG, content); 
  9. @Override 
  10. protected void onRestoreInstanceState(Bundle savedInstanceState) { 
  11. // TODO Auto-generated method stub 
  12. super.onRestoreInstanceState(savedInstanceState); 
  13. Log.i(TAG, "onRestoreInstanceState"); 
  14. if(null!=savedInstanceState){ 
  15. editText.setText(savedInstanceState.getString(TAG)); 

方法二:通过 Activity的相应方法,这里选用onPause() onResume()

在这里是通过SharedPreference存储


  1. @Override 
  2.     protected void onPause() { 
  3.         // TODO Auto-generated method stub 
  4.         Log.i(TAG, "onPause"); 
  5.         String content = editText.getText().toString(); 
  6.         if (null != content) { 
  7.             this.getPreferences(MODE_PRIVATE).edit().putString(TAG, content) 
  8.             .commit(); 
  9.         } 
  10.         super.onPause(); 
  11.     } 
  12.  
  13.     @Override 
  14.     protected void onResume() { 
  15.         // TODO Auto-generated method stub 
  16.         Log.i(TAG, "onResume"); 
  17.         editText.setText(this.getPreferences(MODE_PRIVATE).getString(TAG, "")); 
  18.         super.onResume(); 
  19.     } 

《关于Activity保存状态的研究.doc》

下载本文的Word格式文档,以方便收藏与打印。