首页 >> 大全

LocalActivityManager的内部机制详解

2023-06-29 大全 39 作者:考证青年

的内部机制

内部机制的核心在于,它使用了主线程对象来装载指定的。注意,这里是装载,而不是启动,这点很重要。

所谓的启动,一般是指会创建一个进程(如果所在应用进程还不存在)运行该,而装载仅仅是指把该作为一个普通类进行加载,并创建一个该类的对象而已,而该类的任何函数都没有被运行。

提供了一个重要方法(),该方法正是利用主线程去装载指定的,其执行过程如图10-25所示。

类中()的执行流程

对象必须已经被初始化,初始化的工作是在()方法中首先被完成的,而这又是在 类中的()中被调用的。也就是说,的 ()方法必须在所在的的()方法执行完毕后被调用。

判断目标是否包含在该中。中使用两个列表变量保存已经装载过的对象,分别是 和。前者是一个类型,每一个按照一个字符串对 应;后者是一个列表。

判断装载的对象是否有正处于状态的,如果有,则要先暂停,事实上可以完全不用暂停,暂停仅仅是希望完全 按照对象本身的执行顺序调用它,从而使得看上去更像是一个标准的子启动方式。而暂停则是通过调用 ()完成的。

如果目标已经被装载到了当前中,下面就需要判断是直接使用该的当前窗口呢,还是需要先销毁该 ,并重新调用其()?注意,这里所说的销毁仅仅是指把变成"销毁"的状态而已,并不是说销毁该 对象。而判断的规则有点类似于AmS中根据的flag执行不同的操作,其中包括是否先调用目标的 (),还包括是否是模式。一般作为的嵌入式都不会是 模式,否则,如果多个Tab页使用同一个对象将导致所显示的内容完全相同。

调用()改变指定到状态。

返回所对应的窗口。

从以上步骤可以看出,装载对象的过程对AmS来讲是完全不可见的,因为这是装载而不是启动,因此看似同时运行 了多个,而实际上仅仅是运行了一个。那些嵌入的仅仅是贡献了自己所包含的 窗口而已,正是把这些窗口的作为的子视图而已。

下面对( r, int )函数的过程进行说明,参数r代表目标对象,代表期望把目标改变成哪种状态。

()函数内部首先判断r.是否是或者状态,如果是则直接返回。因为 代表刚刚创建了目标对象,还没有执行()方法,所以不能改变状态;代表已经销毁,也不能 改变状态。

接着,判断r.是否是状态,这种情况只有在第一次调用()装载目标 对象时才会执行到,其内部主要包括调用()和y()将目标 改变到或者状态。

由于当前状态不同,要想达到不同的期望状态自然需要经过不同的步骤。()函数内部正是使用语句 先判断当前处于什么状态,然后再在case里面使用if…else语句判断期望的状态,最后再调用不同的函数。其状态和调用关系如表10-8所示,该表中 调用的函数名称使用了简写,比如ty简写为。

表10-8 在不同状态中转换时需执行的操作

目标状态

当前状态

();

();

();

Stop();

();

_内部孵化机制_内部制衡与监督机制

Pause();

Stop();

Pause();

从以上的步骤可以看出,()的内部执行逻辑有点像AmS中根据当前状态调用不同方法。这两者就像《西游 记》中的小雷音寺和大雷音寺,两者的本质区别在于仅仅是为了获取对应的对象,中间 的状态切换仅仅是为了保证本身的执行过程,从而保证对象的视图内容有一个正确的呈现。

内部的生命期控制

前面分析了内部的执行原理,接下来分析一个有意思的问题:"在的多个Tab页切换时,内嵌的对象会在()和()之间切换吗?"

从上面的分析可知,装载的目的仅仅是为了获取其所包含的对象,而一旦获取后,则似乎不需要再纠缠于 本身的生命期状态变换操作。其实笔者也是这么认为的,可以尝试屏蔽以下代码,该段代码的作用是在装载下一个之前先暂停当 前的对象。

屏蔽后,运行结果丝毫不受影响,原因很简单,这里做暂停的目的仅仅为了保持原有的生命期过程,从而可以保持原有释 放相关资源的行为。比如当 A以启动的方式运行时,如果另一个 B要启动,则会先暂停A。在一般的程序设计中,暂停会回调()操作,如果该使用了大量的内存或者其他资源,在 ()函数中程序员可能会尝试释放这些资源以提高系统效率,这就是为什么在中也保持了这种流程的原 因。当然,如果你不释放,也不会发生什么逻辑错误。

而在以上代码的()操作中调用了的()或者()操作,这就是为什 么在Tab页切换时,对应的也会执行()或者()的原因。这完全与AmS无关,因此不要因为这个而产生 同时运行了两个(本身和嵌入的)的错觉。

另外还有一个有意思的问题,请思考下面的操作过程。

打开一个,比如"联系人"程序,在上面的四个Tab页上都点一次,然后再按"Home"键回到桌面,然后再从联系人图标中进入该程序。请思考此时内嵌的会发生生命期状态改变吗?

首先当然会从stop状态转变为start状态,并先后调用()和()。因为它是一个标准的 ,的父类是,而在该类中,相应的onXXX()方法内部都增加了 r.()代码,比如:

void () {

r.();

};

而在中,()则会把相应的 再到所包含的所有嵌入式对象中。所以,以上问题的答案是内嵌的生命期会从stop状态转换 到状态。仔细查看的onXXX()函数发现,唯独没有()方法,其原因是在 的()方法中可以直接把子的状态从stop改变到,所以, 此处可以省略对()的重载。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了