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

1.运行的时候

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

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

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

@Override
publicvoidonBackPressed(){
//这里处理逻辑代码,该方法仅适用于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键后再次运行改程序

如果将activity的android:configChanges=”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被调用的前提是,activityA“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activityA的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activityA,这种情况下activityA一般不会因为内存的原因被系统销毁,故activityA的onRestoreInstanceState方法不会被执

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

在onCreate(BundlesavedInstanceState)和onRestoreInstanceState(BundlesavedInstanceStae)都可以进行数据的恢复,

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


@OverrideprotectedvoidonSaveInstanceState(BundleoutState){//TODOAuto-generatedmethodstubsuper.onSaveInstanceState(outState);Log.i(TAG,"onSaveInstanceState");Stringcontent=editText.getText().toString();if(null!=content){outState.putString(TAG,content);}}@OverrideprotectedvoidonRestoreInstanceState(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onRestoreInstanceState(savedInstanceState);Log.i(TAG,"onRestoreInstanceState");if(null!=savedInstanceState){editText.setText(savedInstanceState.getString(TAG));}}

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

在这里是通过SharedPreference存储


@OverrideprotectedvoidonPause(){//TODOAuto-generatedmethodstubLog.i(TAG,"onPause");Stringcontent=editText.getText().toString();if(null!=content){this.getPreferences(MODE_PRIVATE).edit().putString(TAG,content).commit();}super.onPause();}@OverrideprotectedvoidonResume(){//TODOAuto-generatedmethodstubLog.i(TAG,"onResume");editText.setText(this.getPreferences(MODE_PRIVATE).getString(TAG,""));super.onResume();}