Android的进阶学习(一)--Activity异常退出

作者: MathiasLuo | 来源:发表于2015-11-24 16:48 被阅读2792次

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

    Activity的异常退出

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

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

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

    
    @Override
    protected 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){
            //取出数据 想干嘛就干嘛吧  
        } 
        }
    
    

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

    @Override
    protected 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   
     android:name=".MainActivity"
     android:configChanges="keyboardHidden|orientation" />
    

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

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

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

    最后

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

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

    相关文章

      网友评论

      • 愛餅才會丫:写的不错 :relaxed:
      • 3e3649f4c500:最后应是demo ?
        MathiasLuo: @iRe 我是英语渣😂😂
      • 妙法莲花1234:这两个在玉刚的书里有讲到
        MathiasLuo: @追风917 以前没有系统的学习,现在遇到任大大的《Android开发艺术探索》,就迫不及待的写下,加强记忆和理解了。
      • LostAbaddon:“一.Activity的config改变当一个activity的config改变的时候,Activity就会被销毁然后重建。”
        这个段落的标题读着很不通顺啊。。。
        应该是“一.当一个activity的config改变的时候,Activity就会被销毁然后重建。”这样的吧。。。
        MathiasLuo: @塔塔酱 好的哟,有图的话理解肯定会更容易些了。谢谢,谢谢。
        LostAbaddon:@Mathias 改改吧~~

        另,如果画一张LifeCycle的图,通分支把异常退出的情况也画上去的话,读者看起来会更加直观。
        当然啦,你的工作量也就大一点了。
        个人意见而已啦。
        MathiasLuo: @塔塔酱 嗯 才开始学习写 谢谢指出😁

      本文标题:Android的进阶学习(一)--Activity异常退出

      本文链接:https://www.haomeiwen.com/subject/dvvlhttx.html