【Android面试】(二):你不能不知道的view

上次面试,Android开发,被问到:你知道android中,布局文件中加id和不加id有什么区别?这个我真的不知道,蒙了,只能硬着头皮说:加了id会在R文件中生成对应id的数值,然后扯了点view树,总之答非所问。。。虽然最后面试也过了,但是这个问题一直萦绕在心头,挥之不去。刚好今天复习Activity生命周期的时候,看到了相关知识点。

有关Activity的onSaveInstantceState(Bundle outState)方法的一些基础知识在上篇文章中有提到过,大家可以去看看:【Android面试】(一):Android中activity保存状态和数据到底该在哪个方法中进行,必须承认,上篇文章中调侃的语气太重,如果有冒犯,提前说句抱歉,本人还是很尊重面试官的,毕竟肯定要比我强才来面试我。

Activity中的onSaveInstantceState

这回还是要从activity中的onSaveInstantceState(BundleoutState)方法说起,下面快速的过一下onSaveInstantceState(BundleoutState)的几个要点:

1、onSaveInstantceState(BundleoutState)会在activity能够被销毁之前被调用,也就是所谓的(killble)状态,这个在上篇中有提到

2、onSaveInstantceState(BundleoutState)会在onStop()方法之前被调用,但不保证会在onPause()方法之前还是之后被调用。

3、重点!!!onSaveInstantceState(BundleoutState)不是一定会被调用的,什么时候会被调用呢?简单一句话:当Activity要进入这么一种状态:“系统可能会以非应用行为退出Activity方式干掉Activity”之前,系统就会调用onSaveInstantceState(BundleoutState)方法。

4、非应用行为退出

什么是非应用行为退出?应用行为退出Activity:比如主动调用finish()方法,或者主动按Back键,让Activity结束。非应用行为退出:比如一个Activity在后台,过了很长时间也没有被重新调用显示出来;又或者系统当前资源非常紧张,主动kill掉当前activity,释放资源以供其他应用使用。

这样设计的逻辑是很清晰的:当系统不确定会不会什么时候在未经“允许”的突发情况下结束掉Activity,在进入这种状态之前,肯定需要保存一下我们想要的数据,比如Activity中有控件有状态值,可以通过onSaveInstantceState(BundleoutState)进行保存,但是就像上一篇文章中说的,onSaveInstantceState(BundleoutState)不保证一定会被调用,因为它不是Activity生命周期中的方法。

5、假设onSaveInstantceState(BundleoutState)方法被调用了,且也保存了数据到Bundle对象,那么什么时候会将其取出来?

上面的第3点中提到过,在系统要进入可以使用“非应用行为”杀死Activity状态之前,会调用onSaveInstantceState(BundleoutState)方法,而Bundle对象可能被取到的条件,就是系统确实使用“非应用行为”杀死了Activity,而在要重建Activity时,会首先将Bundle对象传给onCreate,然后再传给onRestoreInstanceState(Bundle savedInstanceState)方法。如果onSaveInstantceState(BundleoutState)方法调用之后,Activity没有“意外杀死”,那么再次启动Activity时,只会调用onStart–onResume,而不会调用onRestoreInstanceState(Bundle savedInstanceState)方法。

onSaveInstantceState例子

下面把一个Activity在启动到被旋屏之后重新创建的过程打印结果展示出来,这里在onSaveInstantceState方法中往bundle中存一个当前时间,然后在onCreate方法和onRestoreInstanceState方法中将其取出,onCreate方法中会对Bundle进行判空:

启动:

旋屏之后:

下面给Activit中加两个按钮,让它点击跳转到第二个activity,不同的是,一个按钮会在点击时调用finish方法,而另一个则不会:

跳转调用finish()方法:

跳转不调用finish()方法:

发现在onCreate第一次调用时,Bundle为null,而在旋屏之后,onCreate和onRestoreInstanceState方法中都拿到了传过来的时间。

而在主动调用finish结束activity时,没有调用onSaveInstantceState方法;而如果不finish掉activity1,直接跳转activity2,则会在activity1的onStop之前调用onSaveInstantceState方法。

View中的onSaveInstantceState和id的关系

好了,说了一大堆,貌似还没有进入本文关注的焦点。。。下面就来了:

上面说了onSaveInstantceState方法,下面来看看这个方法里到底干了什么:(你mei的,怎么还是onSaveInstantceState方法?!汗Σ( ° △ °|||)︴,就快到了)

来看看Activity中的源码:

造物之前,必先造人。

【Android面试】(二):你不能不知道的view

相关文章:

你感兴趣的文章:

标签云: