本章节翻译自《Beginning-Android-4-Application-Development》,如有翻译不当的地方,敬请指出。

原书购买地址http://www.amazon.com/Beginning-Android-4-Application-Development/dp/1118199545/


目前为止,我们已经了解到了,当改变屏幕方向的时候,activity将会被销毁,随后被重建。请记住一点,当activity被重建之后,它的当前信息可能消失。当一个activity被kill掉,将会调以下方法中的一个或着两个:

  • onPause() —— 当一个activity被kill掉或被转入后台的时候,这个方法总是被调用。
  • onSaveInstanceState() —— 当一个activity将被kill掉或转入后台的时候,这个方法也会被掉用,就像onPause()方法一样。但是,当一个activity从调用栈中清除的时候(例如按返回键的时候),这个方法不会被调用(注:onPause()方法会被调用),因为已经没有必要保存它的状态了。
简而言之,想要保存activity的状态,那么总是要实现onPause()方法,然后使用你自己的方法去保存状态信息,例如使用数据库,外部或内部的存储。 如果你想简单地保存状态信息,当activity在重新创建的时候,从新加载这些信息。一个简单的方法就是实现onSaveInstanceState()这个方法,因为它提供了一个Bundle对象作为参数,这样,就可以使用这个Bundle对象去保存activity的信息。下面的代码将展示如何使用onSaveInstanceState()方法: [java] view plain copy
  1. @Override
  2. publicvoidonSaveInstanceState(BundleoutState){
  3. //---savewhateveryouneedtopersist---
  4. outState.putString("ID","1234567890");
  5. super.onSaveInstanceState(outState);
  6. }
当一个activity被重建,onCreate()方法会首先被调用,然后是onRestoreInstanceState()方法,就是这个方法能够取回刚刚通过onSaveInstanceState()方法保存的信息:
[java] view plain copy
  1. @Override
  2. publicvoidonRestoreInstanceState(BundlesavedInstanceState){
  3. super.onRestoreInstanceState(savedInstanceState);
  4. //---retrievetheinformationpersistedearlier---
  5. StringID=savedInstanceState.getString("ID");
  6. }
尽管可以使用onSavaInstanceState()方法去保存状态信息,但这也有限制:只能通过Bundle对象去保存你的信息。如果你想保存更多的、更复杂的数据结构,这种方法就显得不太合适了。 可以使用的另外一种方法是使用onRetainNonConfigurationInstance()回调方法。当一个activity因为配置更改(例如屏幕方向的改变)而奖杯销毁的时候,Android系统将调用这个方法。可以这么使用: [java] view plain copy
  1. @Override
  2. publicObjectonRetainNonConfigurationInstance(){
  3. //---savewhateveryouwanthere;ittakesinanObjecttype---
  4. return("Sometexttopreserve");
  5. }
把你想保存的东西,通过这个方法返回出来。 可以观察到,这个方法返回一个Object对象,这就允许你返回任何数据类型。如果要提取保存的数据,可以在onCreate()方法中进行提取,使用getLastNonConfigurationInstance()回调方法: [java] view plain copy
  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. Log.d("StateInfo","onCreate");
  5. Stringstr=(String)getLastNonConfigurationInstance();
  6. }
onRetainNonConfigurationInstance()和getLastNonConfigurationInstance(),这两个方法可以允许你随时地保存信息。
例如,当用户下载数据的同时改变了屏幕方法,使用这两个方法去保存数据,总好过重新下载数据吧。

更多相关文章

  1. Android(安卓)4.4以上使用HttpURLConnection底层使用OkHttp实现
  2. Android——Jni使用总结
  3. android夜间模式的实现
  4. OkHttpClientManager使用
  5. Android(java)学习笔记125:Clock app编写报错02
  6. android线程间通信和主线程更新ui
  7. Android中对TextView中的部分内容的字体样式的设置方法
  8. [Android(安卓)Pro] android 混淆文件project.properties和progu
  9. Android下的JNI创建多线程的方法

随机推荐

  1. Android集结号
  2. flutter项目的打包和发布 主要是Android
  3. [置顶] android 自己创建一个注释模板
  4. 从使用到源码,细说 Android(安卓)中的 tin
  5. Android中Webview使用自定义的javascript
  6. 你有什么秘密 iPhone全都知道
  7. 用 天天模拟器 + Eclipse或Android(安卓)
  8. Android(安卓)dpi、dip、px、分辨率、屏
  9. 戏说Android(安卓)view 工作流程《上》
  10. UISwipeGestureRecognizer ---手指动作