Activity非正常销毁后重新创建问题
2016-01-11 15:57
274 查看
当Activity非正常销毁时(典型:横屏竖屏切换时Activity会执行onPause,onStop,onDestroy方法,然后重新创建Activity);但重新创建的Activity会保存之前Activity存储的数据(比如EditText中的内容在横屏竖屏切换后不会发生变化);像横屏竖屏导致切换以及其他操作导致的系统配置发生变化,Activity都会被销毁,由于Activity是非正常情况下终止的,所以系统会调用onSaveInstanceState方法来保存当前Activity的状态,这个方法会在onPause方法之后onStop方法之前执行(注:Activity在正常终止时不会调用该方法),当Activity被重新创建后,系统会调用onRestoreInstanceState方法,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState方法和onCreate方法.因此,我们可以通过onRestoreInstanceState方法来和onCreate方法来取出之前Activity保存的数据,如果能够取出之前数据则证明Activity被重载,反之Activity没有被重载.代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState!=null){ String test=savedInstanceState.getString("extra_test"); Log.e(TAG,"Oncreate"+test); }
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e(TAG,"onSaveInstanceState"); outState.putString("extra_test","test"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String test = savedInstanceState.getString("extra_test"); Log.e(TAG,"onRestoreInstanceState:"+test); }logcat如下:01-12 10:20:33.622 17716-17716/com.eduask.practive E/MainActivity: onPause01-12 10:20:33.647 17716-17716/com.eduask.practive E/MainActivity: onSaveInstanceState01-12 10:20:33.652 17716-17716/com.eduask.practive E/MainActivity: onStop01-12 10:20:33.652 17716-17716/com.eduask.practive E/MainActivity: onDestroy01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onCreate01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: Oncreatetest01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onStart01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onRestoreInstanceState:test01-12 10:20:33.787 17716-17716/com.eduask.practive E/MainActivity: onResume上面分析了系统的数据恢复机制,我们现在知道了系统配置发生改变后,Activity会被重新创建,但如果不想让Activity在系统配置发生改变时被重新创建,则需要在清单文件的Activity标签中指定configChanges属性.比如不想让Activity在横屏竖屏切换时重新创建,则可以给configChanges属性添加orientation这个值(更多configChanges属性可以去百度),如下图然后重写一下方法,则可实现上述效果
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.e(TAG,"onConfigurationChanged:"+newConfig.orientation); }
logcat如下:
01-12 10:21:54.922 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:201-12 10:21:58.937 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:101-12 10:21:59.642 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:201-12 10:22:04.542 20431-20431/com.eduask.practive E/MainActivity: onConfigurationChanged:1
相关文章推荐
- 常用算法之快速排序
- Centos6.4安装JDK
- httpclient4.3.3详解一:RequestConfig类解析
- Runtime关联引用
- javascript设置iframe里子窗口全屏
- ABAP predefined datatype
- 屏蔽关机全屏应用在recent列表中显示
- js获取上传文件大小
- HTML5基本页面样式
- what difference between libfm and libffm
- C# JSON 库
- dedecms的arclist循环中判断第一个li添加css,否则不加
- ViewTreeObserver简介
- 蓝桥杯--算法提高 排列数 (简单dfs)
- linux下的wpa_supplicant工具使用
- Kafka
- ViewTreeObserver
- Python入门笔记
- 跨平台APP----使用DCloud公司产品跨平台开发(系列三)
- TypeError: decoding Unicode is not supported