由于手机是便捷式移动设备,掌握在用户的手中,它的展示方向我们是无法预知的,具有不确定性。平时我们拿着手机多数为竖屏,但有时候我们感觉累了也会躺着去使用手机,那么这时手机屏幕的展示方向可能已经被用户切换成横屏,由于竖屏和横屏的界面宽高比例不同,那么我们的布局界面就会发生改变,所以是件很麻烦的事情,我们需要去准备两套UI布局,当然很多时候我们为了节省设计成本,只准备一套UI布局(竖屏或者横屏),使程序固定在一个方向,让其不跟随着屏幕的旋转而旋转。在这里我们先不去管这些东西,我们来看看当屏幕旋转的时候,Activity的生命周期是怎么走的:

实验五:

  启动一个Activity,对屏幕进行翻转,观看生命周期的变化

结论:

  在我们翻转屏幕的时候,会销毁当前的Activity,然后重建Activity。

对Activity进行重建的时候,我们的数据就会丢失,很多时候,当我们切换到别的Activity的时候,需要保存当前Activity的状态或者是临时数据,那么我们该怎么办呢?

  我们在Activity里再覆写这两个方法:

@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);Log.i(TAG, "1----------onSaveInstanceState");}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);Log.i(TAG, "1----------onRestoreInstanceState");}

然后我们再来看下这两个方法是什么时候被调用的:

1、当正常进入退出的时候,生命周期依旧正常,这两个方法没有被调用:

2、当我们正常进入一个Activity点击按钮跳转到别的Activity的时候,我们会发现onSaveInstanceState在第二个Activity获取屏幕焦点(onResume)之后,在       第一个Activity执行onPause之后,onStop之前调用了此方法,当从第二个Activity切换回来的时候就重复执行着实验四。

细心的朋友可能已经发现,onSaveInstanceState方法里有个Bundle类型的回调参数,在onCreate里面也有个Bundle类型的参数,没错,答案就在这里,如果我们要对Activity的数据或者状态进行临时性的保存时,我们可以在onSaveInstaceState存入参数,类似这样的:

1     @Override
2     protected void onSaveInstanceState(Bundle outState) {
3         super.onSaveInstanceState(outState);
4         outState.putString("name","Rabbit");
5         Log.i(TAG, "1----------onSaveInstanceState");
6     }

在onCreate里获取:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取保存数据if (savedInstanceState!=null){Log.i(TAG, "I am "+savedInstanceState.get("name") );}//点击按钮跳转第二个ActivitymbButton = (Button) findViewById(R.id.bt_button);mbButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(MainActivity.this, SecondActivity.class));}});Log.i(TAG, "1----------onCreate");}

在onRestoreInstanceState里取:

@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);//获取保存数据if (savedInstanceState!=null){Log.i(TAG, "I am "+savedInstanceState.get("name") );}Log.i(TAG, "1----------onRestoreInstanceState");}

无图无真相,来看下实验结果图,我进入了Activity对屏幕翻转,触发Activity重建,可以看到数据已经被保存了。

但这里有个疑问,当我们不翻转屏幕,也就是不触发Activity重建的时候,我们是没有执行onCreate,onRestoreInstanceState方法的,所以这个Bundle对象我们不一定是可以拿到的,那数据保存不就变得很不可靠了吗?

  没错,由于Activity重建的不确定,所以saveInstanceState保存的数据一般都是临时性的,真正持久化操作我们应该在onPause方法里操作。

这里额外的要提到一点,onRestoreInstanceState方法在两种状态下会被调用:

1、在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;

2、在用户改变屏幕方向时,重建的过程中,此方法会被调用。

6、关于屏幕方向改变Activity会重建的应对策略:

1、

  指定为竖屏:在AndroidManifest.xml中对指定的Activity设置:

android:screenOrientation="portrait"

  或者在onCreate方法中指定:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  //竖屏  

  指定为横屏:在AndroidManifest.xml中对指定的Activity设置:

android:screenOrientation="landscape"

  或者在onCreate方法中指定:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //横屏  

2、

  锁定屏幕虽然可以实现我们想要的效果,但并不是很好的一种做法,为了避免这样销毁重建的过程,我们可以在AndroidMainfest.xml中对对应的<activity>配置:

android:configChanges="orientation"

  如果是Android4.0,则是:

android:configChanges="orientation|keyboardHidden|screenSize"

  然后我们在Activity里重写onConfigurationChanged方法:

1     @Override
2     public void onConfigurationChanged(Configuration newConfig) {
3         super.onConfigurationChanged(newConfig);
4         Log.i(TAG, "1----------onConfigurationChanged");
5     }

  这样Activity在翻转屏幕的时候就不会被销毁重建了,只是调用了onConfigurationChanged方法。

总结:

做工作中,你可能感兴趣的三个关键环① 完整生命周期② 可见生命周期③ 可交互生命周期 
如图所示,图中的周期都是大的包括小的:

在实际工作中的使用
①onResume可见, 可交互.。把动态刷新的操作启动。
②onPause部分可见, 不可交互. 把动态刷新的一些操作, 给暂停了。
③onCreate 初始化一些大量的数据
④onDestroy 把数据给释放掉, 节省内存。

转载于:https://www.cnblogs.com/cuishuang/p/5714374.html

Activity-数据状态的保存相关推荐

  1. Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...

    一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...

  2. Activity的状态保存

    当点击home键或程序运行过程中突然来电话等意外情况或屏幕方向改变时,会调用onSaveInstanceState()方法进行保存数据到手机硬盘上,再次运行Activity时则调用onRestoreI ...

  3. Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)...

    一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...

  4. 保存Activity的状态

    如果你想保存Activity的信息(例如,类实例的变量)而又不需要和其它的组件共享的话,你可以调用Activity的getPreferences方法,不用指定一个Preference的名字.对返回的S ...

  5. Android Activity中状态保存机制

    在Activity中保存用户的当前操作状态,如输入框中的文本,一般情况下载按了home键后,重新进入文本框中的东西会丢下,所以我们要保存当前页面信息,如在写短信的时候接到一个电话,那么当你接电话的时候 ...

  6. Android零基础入门第76节:Activity数据保存和横竖屏切换

    在前面几期学习了Activity的创建.配置.启动和停止,还学了Activity的生命周期,本期一起来学习Activity有关的更多事儿. 一.数据保存 通过上一期 LogCat 窗口打印的日志可以看 ...

  7. react大数据量渲染_React 中的状态自动保存(KeepAlive)

    什么是状态保存?假设有下述场景:移动端中,用户访问了一个列表页,上拉浏览列表页的过程中,随着滚动高度逐渐增加,数据也将采用触底分页加载的形式逐步增加,列表页浏览到某个位置,用户看到了感兴趣的项目,点击 ...

  8. activity状态的保存和恢复

    activity状态的保存和恢复 一.简介 1.保存activity状态 * 保存activity状态,onSaveInstanceState这个方法会自动保存有ID的组件的状态 * 没有ID的组件或 ...

  9. Android零基础入门第81节:Activity数据传递

    在Android开发中,经常要在Activity之间传递数据.前面也学习了Activity和Intent相关基础,接下来一起来学习Activity的数据传递. 一.简介 通过前面的学习知道,Inten ...

最新文章

  1. mysql 常用sql语句 简介
  2. 如何使用CNN进行物体识别和分类_CNN原理与实践指南
  3. 设计用例测试下面的python程序def do_你能变形python的unittest测试用例吗?
  4. ExpandableListActivity列表嵌套列表
  5. Linux中用户与组群管理
  6. python快速示例_python实现快速排序的示例(二分法思想)
  7. 如何找到自己正确需要的抖音搜索关键词
  8. python保存快捷键是什么_python常用快捷键
  9. 如何 让 Chrome (谷歌)浏览器 自动翻译
  10. 使用GloVe生成中文词向量
  11. 1-14 Burpsuite Repeater介绍
  12. Android 动画解析(一) 逐帧动画(Frame Animation)
  13. 齐岳定制EG/Li-BH4复合储氢材料/La2Mg17-Ni复合储氢材料/Mg-Nb/Mg-Nb2O5复合储氢粉体复合材料
  14. heic(HEIF)格式图像处理(一)
  15. Linux服务器常用命令 - 记录(Anaconda/Matlab/VNC/Python)
  16. Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载
  17. crash: mod命令
  18. 口红的html前端显示,初学者怎么涂口红自然
  19. QQ2009 暂时无法登陆,请稍候重试 问题解决方法
  20. 网络中工作组中计算机无法访问或没有选项的解决办法汇总

热门文章

  1. TCP传输连接建立与释放详解
  2. FTP 1 协议分析
  3. Asp.Net 构架(HttpModule 介绍) - Part.3
  4. SQL查询单表数据之组合(三)
  5. IOS多线程任务(综述篇)
  6. Android音乐播放器高级开发
  7. Mr.J--Javascript表格创建 模糊搜索 关键词搜索
  8. 99乘法表(java版)
  9. 【LeetCode】24. Swap Nodes in Pairs
  10. EasyUI动画效果