对Android Activity添加容错处理

Android的四大组件 ActivityServiceBroadcast ReceiverContent Provider是一个android应用开发人员必须了解的基本知识,其中Activity是用的比较多的,Activity的生命周期基本都很了解,程序在正常运行的时候Activity的生命周期是可以按照你的预期走下去,但是如果应用发生了异常应该怎么处理呢?比如在系统内存比较紧张的情况,你的应用被系统回收了怎么办?也许有些人说将自己的应用设置为system app不就可以了吗,或许这样是可以的,但是在极端的情况下system app也是会被系统杀死的,所以一个好的应用不仅应该在保证你的程序在正常情况下时能够良好的运行,也应该为你的应用添加相应的容错处理。

     Android系统本身对Activity就有一些容错处理,这里就针对onSaveInstanceState()、onRestoreInstanceState()两个方法进行说明。

    一、基本作用:

    Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,比如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,Android系统认为用户的行为不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

    在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时可以恢复其先前状态。

    例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。

    关于onSaveInstanceState (),是在函数里面保存一些View有用的数据到一个Parcelable对象并返回。在Activity的onSaveInstanceState(Bundle outState)中调用View的onSaveInstanceState (),返回Parcelable对象,接着用Bundle的putParcelable方法保存在Bundle  savedInstanceState中。当系统调用Activity的的onRestoreInstanceState(Bundle savedInstanceState)时, 同过Bundle的getParcelable方法得到Parcelable对象,然后把该Parcelable对象传给View的onRestoreInstanceState (Parcelable state)。在的View的onRestoreInstanceState中从Parcelable读取保存的数据以便View使用。

    二、onSaveInstanceState()函数的调用时机

    根据Android的官方文档中的描述为:当某个activity“容易”被系统销毁的时候调用。注意这句话中的双引号,“容易”被销毁,这句话很可能被误解为当系统销毁我的activity时才会被调用,其实不是这样的,它的意思就是说该activity还没有被销毁,而仅仅是一种可能性。那么onSaveInstanceState()被调用的时机有哪些呢?总结如下:

   (1)从activity A中启动一个新的activity B时。

   (2)长按HOME键,选择运行其他的程序时。

   (3)按下电源按键关闭屏幕显示时。

   (4)屏幕方向切换时,例如从竖屏切换到横屏时。

   (5)当用户按下HOME键时。

    总而言之一句话就是:在系统未经你的许可就有要销毁在后台运行的你的activity的可能性时,onSaveInstanceState()函数就会被调用。如果activity确实被销毁了,那么onSaveInstanceState()函数会在onPause或者onStop之前调用。

    三、onRestoreInstanceState()函数的调用时机

    onRestoreInstanceState()被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。如果onRestoreInstanceState()函数被调用了,那么它是在onStart与onResume之间调用。这里 有一点要注意就是:onRestoreInstanceState()和onSaveInstanceState()并不是一定会成对的调用。 例如用户按下HOME键回到主界面,在系统认为你有可能在未经你的允许下要销毁activity,这时onSaveInstanceState()函数被调用,这时用户又返回到activity,这种情况下activity 一般不会因为内存的原因被系统销毁,所以onRestoreInstanceState()不会被调用。

     onRestoreInstanceState()函数与onSaveInstanceState ()函数的调用关系总结为:调用onSaveInstanceState ()函数一定会调用onRestoreInstanceState()函数,但是调用onRestoreInstanceState()函数,不定会调用onSaveInstanceState ()。

    四、onSaveInstanceState()中父类函数的调用

    如果你的activity是继承FragmentActivity,并且管理了很多fragment,如果你的activity未经你的允许销毁了activity,这个时候会调用onSaveInstanceState()函数,其中函数中会有super.onSaveInstanceState()这样一段调用父类函数的一个语句,如果执行了这段语句有时会导致你的多个fragment重叠的情况,因为默认时系统会调用父类函数去保存视图图层,这样有时会导致fragment重叠问题,所以需要将super.onSaveInstanceState()这句话删掉。

你可能感兴趣的:(Android,Android,Activity,容错)