package cn.com.sxp;import android.app.Activity;import android.os.Bundle;import android.util.Log;public class OnrestoreActivity extends Activity {private static final String TAG = OnrestoreActivity.class.getSimpleName();private int count = 0;private boolean thread;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (null != savedInstanceState) {int preSavedInt = savedInstanceState.getInt("preSavedInt");String preSavedStr = savedInstanceState.getString("preSavedStr");Log.e(TAG, "onCreate we get prior preSavedInt is: " + preSavedInt+ " and preSavedStr is: " + preSavedStr);}setContentView(R.layout.main);new Thread(new Runnable() {@Overridepublic void run() {while (true) {if (!thread) {Log.v(TAG, Boolean.toString(thread));try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}count++;Log.v(TAG, "count : " + count);}}}}).start();}// 为了防止万一程序被销毁的风险,这个方法可以保证重要数据的正确性// 不写这个方法并不意味着一定出错,但是一旦遇到了一些非常奇怪的数据问题的时候// 可以看看是不是由于某些重要的数据没有保存,在程序被销毁时被重置@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {savedInstanceState.putInt("preSavedInt", count);savedInstanceState.putString("preSavedStr", "we are saved in onSaveInstanceState");super.onSaveInstanceState(savedInstanceState);Log.e(TAG, "onSaveInstanceState");}@Overridepublic void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);int preCount = savedInstanceState.getInt("preSavedInt");String preStr = savedInstanceState.getString("preSavedStr");Log.e(TAG, "onRestoreInstanceState we get preCount is: " + preCount + " and preStr is: "+ preStr);}public void onDestroy() {super.onDestroy();this.thread = true;}public void onPause() {Log.v(TAG, "onPause");super.onPause();thread = true;}public void onResume() {Log.v(TAG, "onResume");super.onResume();thread = false;}public void onStop() {Log.v(TAG,"onStop");super.onStop();this.thread = true;}}


当Activity onResume 时打印日志如下:

此时一切正常,没有调用 onSaveInstanceState() 等方法;就这样我让这个线程跑了30多次,之后做了一个横竖屏切换,发生的日志如下:



可以看到,Activity 即将转入 onPause() 方法,在这之前系统调用了 onSaveInstanceState() 方法,果然啊,系统怕在onPause () 时销毁掉 Activity,所以调用该方法保存一些数据,后面才依次调用 onPause() 和 onStop() 方法。

再看看,切换到竖屏后,Activity 被重新构建,果然此时 Activity 就从之前保存的数据再读出来。onCreate() 方法后又调用了 onRestoreInstanceState() 方法,之后才是正常的其他状态出马,继续恢复起线程的运行。


好了,到这里我手痒,又按下了 Home 键,日志打印如下:


可以看到,与切换到竖屏是一样的效果。

好吧,恢复这个程序的运行吧,日志如下:


继续 onResume()。


很强大。以上事例说明,我本人不想销毁,但是系统由于内存的原因或者其他什么原因不得不销毁,系统还不给我机会让我保存数据?倘若该 Activity 被我主动销毁的话,例如我闲的蛋疼按下 Back 键,这个方法就不会被调用(值得一试)。

先总结以下几点关于onSaveInstanceState方法被调用的场景:

1、爷按下 Home 键

按下后,当然是 Home 界面了,原来的应用程序当然不可见啦,应该是 onStop 状态(以上已经测试);这就危险了,该活动可能被销毁,所以被调用(以上已经测试);

2、按下电源按键(关闭屏幕显示)

也就是我要待机了

3、从一个 Activity 启动第二个 Activity(没有测试)

4、横竖屏切换(以上已经测试)


那还有一个 onRestoreInstanceState() 方法呢。这个方法调用的前提是,一个 Activity 被创建了(以上已经测试)。因为一个 Activity 被创建后,你哪知道它之前是销毁了还是没有被销毁的。当然啦,如果是被销毁的,那么 onCreate() 与 onRestoreInstanceState() 的 Bundle参数是一个参数吧(已经测试,输出是一样的)。


参考资料:

http://www.cnblogs.com/itblog/archive/2011/12/08/2281266.html







更多相关文章

  1. 调用android自带的截图工具进行截图
  2. android 中如何解析Rss订阅的xml文件
  3. Android(安卓)调用其他应用-QQ音乐
  4. android > 手机MIC,听筒音量监听
  5. Android(安卓)WebView 图片自适应屏幕宽度
  6. Android(安卓)开发手记二
  7. Android(安卓)api 数据的保存方式
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Flutter&Android&Ios混合工程---1
  2. Android中ViewPager和PagerAdapter的简单
  3. Android(安卓)源码编译环境的搭建
  4. 怎么解决这个问题“The connection to ad
  5. Android(安卓)Audio 分析
  6. 8.3facebook分享后不回调结果原因,java标
  7. ANDROID_SDK_HOME的设置
  8. 深入了解Android图形管道-part1
  9. android 系统启动过程中加入tcpdump和log
  10. Android(安卓)Studio 断点调试和高级调试