LocalActivityManager的内部机制详解( 二 )


从上面的分析可知,装载的目的仅仅是为了获取其所包含的对象,而一旦获取后,则似乎不需要再纠缠于 本身的生命期状态变换操作 。其实笔者也是这么认为的,可以尝试屏蔽以下代码,该段代码的作用是在装载下一个之前先暂停当 前的对象 。
屏蔽后,运行结果丝毫不受影响,原因很简单,这里做暂停的目的仅仅为了保持原有的生命期过程,从而可以保持原有释 放相关资源的行为 。比如当 A以启动的方式运行时,如果另一个 B要启动,则会先暂停A 。在一般的程序设计中,暂停会回调()操作,如果该使用了大量的内存或者其他资源,在 ()函数中程序员可能会尝试释放这些资源以提高系统效率,这就是为什么在中也保持了这种流程的原 因 。当然,如果你不释放,也不会发生什么逻辑错误 。
而在以上代码的()操作中调用了的()或者()操作,这就是为什 么在Tab页切换时,对应的也会执行()或者()的原因 。这完全与AmS无关,因此不要因为这个而产生 同时运行了两个(本身和嵌入的)的错觉 。
另外还有一个有意思的问题,请思考下面的操作过程 。
打开一个,比如"联系人"程序,在上面的四个Tab页上都点一次,然后再按"Home"键回到桌面,然后再从联系人图标中进入该程序 。请思考此时内嵌的会发生生命期状态改变吗?
首先当然会从stop状态转变为start状态,并先后调用()和() 。因为它是一个标准的 ,的父类是,而在该类中,相应的onXXX()方法内部都增加了 r.()代码,比如:
void () {
r.();
};
【LocalActivityManager的内部机制详解】而在中,()则会把相应的 再到所包含的所有嵌入式对象中 。所以,以上问题的答案是内嵌的生命期会从stop状态转换 到状态 。仔细查看的onXXX()函数发现,唯独没有()方法,其原因是在 的()方法中可以直接把子的状态从stop改变到,所以, 此处可以省略对()的重载 。