(转载)Activity-数据状态的保存
由于手机是便捷式移动设备,掌握在用户的手中,它的展示方向我们是无法预知的,具有不确定性。平时我们拿着手机多数为竖屏,但有时候我们感觉累了也会躺着去使用手机,那么这时手机屏幕的展示方向可能已经被用户切换成横屏,由于竖屏和横屏的界面宽高比例不同,那么我们的布局界面就会发生改变,所以是件很麻烦的事情,我们需要去准备两套UI布局,当然很多时候我们为了节省设计成本,只准备一套UI布局(竖屏或者横屏),使程序固定在一个方向,让其不跟随着屏幕的旋转而旋转。在这里我们先不去管这些东西,我们来看看当屏幕旋转的时候,Activity的生命周期是怎么走的:
实验五:
启动一个Activity,对屏幕进行翻转,观看生命周期的变化
结论:
在我们翻转屏幕的时候,会销毁当前的Activity,然后重建Activity。
对Activity进行重建的时候,我们的数据就会丢失,很多时候,当我们切换到别的Activity的时候,需要保存当前Activity的状态或者是临时数据,那么我们该怎么办呢?
我们在Activity里再覆写这两个方法:
1
2
3
4
5
6
7
8
9
10
11
|
@Override protected void onSaveInstanceState(Bundle outState) { super .onSaveInstanceState(outState); Log.i(TAG, "1----------onSaveInstanceState" ); } @Override protected 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
2
3
4
5
6
|
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里获取:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取保存数据 if (savedInstanceState!= null ){ Log.i(TAG, "I am " +savedInstanceState.get( "name" ) ); } //点击按钮跳转第二个Activity mbButton = (Button) findViewById(R.id.bt_button); mbButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { startActivity( new Intent(MainActivity. this , SecondActivity. class )); } }); Log.i(TAG, "1----------onCreate" ); } |
在onRestoreInstanceState里取:
1
2
3
4
5
6
7
8
9
|
@Override protected 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 把数据给释放掉, 节省内存。
(转载)Activity-数据状态的保存的更多相关文章
- Android基础部分再学习---activity的状态保存
主要是bundle 这个參数 參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975 学习Activity的生命周期,我们知 ...
- activity状态的保存和保持(onRetainNonConfigurationInstance和getLastNonConfigurationInstanc
本文转载于:http://chengbs.iteye.com/blog/1156167 比较onsaveinstancestate() 与 onretainnonconfigurationinstan ...
- Android零基础入门第76节:Activity数据保存和横竖屏切换
在前面几期学习了Activity的创建.配置.启动和停止,还学了Activity的生命周期,本期一起来学习Activity有关的更多事儿. 一.数据保存 通过上一期 LogCat 窗口打印的日志可以看 ...
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)
一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Ac ...
- Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)
一.什么是Activity? 简单的说:Activity或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成.都会在Manifest.xml中指定一个主的Activity, ...
- Android Activity中状态保存机制
在Activity中保存用户的当前操作状态,如输入框中的文本,一般情况下载按了home键后,重新进入文本框中的东西会丢下,所以我们要保存当前页面信息,如在写短信的时候接到一个电话,那么当你接电话的时候 ...
- 如何保存 Activity 的状态?
Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功能.一般来说, 调用 onPause()和 onStop()方法后的 activity 实例仍然存 ...
- Android之Activity状态的保存和恢复
系统在某些情况下会调用onSaveInstanceState()和onRestoreInstanceState() 这两个方法来保存和恢复Activity的状态. 一句话:Activity在" ...
- Android中突发情况Activity数据的保存和恢复
Android中突发情况Activity数据的保存和恢复 写在前面:在我们的APP使用的过程中,总有可能出现各种手滑.被压在后台.甚至突然被杀死的情况.所以对APP中一些临时数据或关键持久型数据,就需 ...
随机推荐
- 完全掌握vuex
公司项目中大量的使用了vue,感觉对vue知识的掌握也越来越熟练了,录制视频教程也让我受益匪浅,自己成长的同时,我更希望帮助其他前端小伙伴一起成长.这篇文章我们主要讲解vuex. vuex是一个专门为 ...
- BZOJ 1705: [Usaco2007 Nov]Telephone Wire 架设电话线 DP + 优化 + 推导
Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= ...
- esp32使iOS 获取蓝牙外设的Mac地址
最近在做一个需要上下位机的项目,我负责的任务下位机,使用的主控芯片是esp32.这个项目中有一项是需要手机扫描二维码然后连接作为esp32的蓝牙.二维码中包含了mac地址信息,在手机扫描周围设备的时候 ...
- 数据类型 scanf标准函数 sizeof关键字 二进制(day03)
字符类型的名称是char 字符类型里包含256个不同的整数,每个 整数对应一个字符(例如'a', '^'等) 这些整数和字符完全可以互相替代 ASCII码表列出所有整数和字符的对应关系 ASCII码表 ...
- 七夕心形demo
from turtle import * pensize(1) pencolor('red') fillcolor('pink') speed(5) up() goto(-30, 100) down( ...
- 基于Homestead搭建PHP项目开发环境(适合Zend Framework,Laravel,Yii,thinkphp等)
参考: https://framework.zend.com/bl...参考: https://laravel.com/docs/5.5/... 第一步:软件的下载和安装 软件1:VirtualBox ...
- 继续聊WPF——如何获取ListView中选中的项
在WPF中获Listview中选中的项,与WinForm里面有着很大的区别,要亲身去研究一下在WPF中如果处理,其实也不难,来,下面我们一起来通过一个简单的示例来感悟一下吧. 第一步就是建立一个WPF ...
- javascript基础扫盲
JavaScript基础扫盲 null和undefined 非十进制的表示方法 强制类型转换 运算 null和undefined null是一个是非来表示一个空对象的,故 typeof 的返回值是ob ...
- Pycharm中Git、Github的简单使用和配置
Pycharm中Git.Github的使用 PyCharm本身自带了git,稍微配置一下就可以很好的在图形界面下进行Python项目的版本控制 配置Git 在配置前先新建一个项目,当然也可以打开已有的 ...
- SE955 激光扫描头设置 通过SSI串口进行设置
扫描头是能够进行配置的,使其支持与禁用某些条码类型,设置有两种方式,一种是扫一下相应的设置条码,还有一种是通过SSI(simple serial interface)来设置,以下就讲一下SSI的设置方 ...