最近准备好好从基础学学android,所以还是从必不可少的activity学起走吧。

Activity的异常退出

我们知道android正常启动下Activity的生命周期,但是Activity的遇到异常情况就不会按照这正常的生命周期了。

一.当一个activity的config改变的时候,Activity就会被销毁然后重建。

而我们最熟悉的config的改变就是屏幕方向改变,系统语言改变,还有键盘可见改变了。
当然,由于是异常退出,所以正常情况下的onPauseonstoponDestroy也会被调用。但是,异常的退出,谷歌还是想了办法来解决的。在onstop的前面,系统会调用onSaveInstanceState来保存当前Activity的状态,不过系统只会帮我们保存Activity的视图,而其它的数据 则不会保存,需要你自己复写 onSaveInstanceState来保存了。

@Overrideprotected void onSaveInstanceState(Bundle outState) {     super.onSaveInstanceState(outState);    //在这里我们可以把我们需要保存的东西给写入Bundle    //....... }

接着我们保存了数据就会再新建的Activity中读取出来了,读取保存的数据有两个地方,一个就是我们再熟悉不过的onCreate方法里了:

@Override protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);     setContentView(R.layout.activity_main);    if(savedInstanceState != null){        //取出数据 想干嘛就干嘛吧      }     }

另一种就是一个独立的回调了:

@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {     super.onRestoreInstanceState(savedInstanceState); }

当然,既然回调了这个函数,那么Bundle就不会为空了,所以也就不需要我们进行检查了。对了,onRestoreInstanceState 是在onstart 后面调用的。对此,我们可以和前面的onSaveInstanceStateonStop之前调用联系起来记忆。

ActivityLife.png

从图中我们可以看到我们进行数据保存和恢复的在Activity生命周期的具体位置,其中我想说的是,或许很多人会问 “数据保存为什么有两个地方”,其实并不然,这里我们只是不能确定onSaveInstanceState的具体位置。(ps:这里感觉我还有个遗留的知识点:就是在Activity中启动新的Activity是在当前ActivityonPause之后才启动的,所以谷歌叫我们不要在onPause中做太多耗时的操作.......貌似扯远了)

当然,我们知道了config的改变后会影响Activity的重新产生,那么如果你不想让它重新产生又该怎样办呢?

AndroidManifest中,我们的Activity标签中有一个configChanges 属性,对我们可以通过对它进行设置而让Activity发生了相应的设置变化而不重新创建。

可以用|来设置多个属性,当我们这样设置后,那如果我们的屏幕方向改变(或者你设置的其它属性改变)Activity就不会重新创建了,而是回调Activity中的onConfigurationChanged函数了:

@Overridepublic void onConfigurationChanged(Configuration newConfig) {    super.onConfigurationChanged(newConfig);    //回调在这里,我们就可以操作Configuration了    //........}
二.内存不足的情况下的异常退出

内存不足,貌似这是我们都不想遇到的。但是,遇到了内存不足,android还是会像开始那样对Activity进行数据保存和恢复,所以也就不多说了。

最后

我并没有写damo来验证这些结论,但并不代表这些我们不需要。我觉得用damo去验证是使我们理解并记住所不可缺少的。

还有我是参考《Android开发艺术探索》这本书的,对,就是任大大的。

更多相关文章

  1. 【Android】Handler的应用(一):从服务器端加载JSON数据
  2. Android(安卓)init进程启动过程分析
  3. Android:Intent 显示和隐式 学习
  4. android xml布局之———include.merge.ViewStub
  5. Android(安卓)UI开发第四十一篇——墨迹天气3.0引导界面及动画实
  6. Android开发中如何使用绘制图表
  7. Android(安卓)样式的开发
  8. Android控件的高度,宽度设置
  9. Android(安卓)Volley入门到精通:初识Volley的基本用法(示例,出错

随机推荐

  1. LinearLayout中控件不能居右对齐
  2. android之Fragment-ListFragment的实践(三
  3. Android(安卓)记录一个好用的文件存储操
  4. android webview 获取geolocation
  5. Android设置重复文字水印背景
  6. 【Android】Android(安卓)permission 访
  7. android系统时间获取方式
  8. 有关Android中的java.lang.ClassCastExce
  9. android微信摇一摇功能
  10. Android(安卓)扫描SDCard上的音乐文件以