一.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键后再次运行改程序
如果将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被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执
一.关键字:通过参数Bundle 来进行存储
在onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceStae)都可以进行数据的恢复,
从图中,我们可以看出,onCreate()方法运行在onRestoreInstanceState()方法之前。
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- // TODO Auto-generated method stub
- super.onSaveInstanceState(outState);
- Log.i(TAG, "onSaveInstanceState");
- String content = editText.getText().toString();
- if (null != content) {
- outState.putString(TAG, content);
- }
- }
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onRestoreInstanceState(savedInstanceState);
- Log.i(TAG, "onRestoreInstanceState");
- if(null!=savedInstanceState){
- editText.setText(savedInstanceState.getString(TAG));
- }
- }
方法二:通过 Activity的相应方法,这里选用onPause() 和onResume()
在这里是通过SharedPreference存储
- @Override
- protected void onPause() {
- // TODO Auto-generated method stub
- Log.i(TAG, "onPause");
- String content = editText.getText().toString();
- if (null != content) {
- this.getPreferences(MODE_PRIVATE).edit().putString(TAG, content)
- .commit();
- }
- super.onPause();
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- Log.i(TAG, "onResume");
- editText.setText(this.getPreferences(MODE_PRIVATE).getString(TAG, ""));
- super.onResume();
- }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。