当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

4.1.3 Activity登堂入室

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:10

1.Activity,Window与View的关系好吧,本来就想了解下他们几个的关系,然后手多多,然后就开始看起他们的调用过程来了...结果扣了两个小时,只理解了很小很小的一部分,果然,到底层撸源码的都是大神,比如老罗,还没到那个等级,下面是自己查阅资料,看了下一点源码的归纳所得,如果哪写错了欢迎指出!下面贴下小结图:流程解析:Activity调用startActivity后最后会调用attach方法,然后在PolicyManager实现一个Ipolicy接口,接着实现一个Policy对象,接着调用makenewwindow(Context)方法,该方法会返回一个PhoneWindow对象,而PhoneWindow是Window的子类,在这个PhoneWindow中有一个DecorView的内部类,是所有应用窗口的根View,即View的老大,直接控制Activity是否显示(引用老司机原话..),好吧,接着里面有一个LinearLayout,里面又有两个FrameLayout他们分别拿来装ActionBar和CustomView,而我们setContentView()加载的布局就放到这个CustomView中!总结下这三者的关系:打个牵强的比喻:我们可以把这三个类分别堪称:画家,画布,画笔画出的东西;画家通过画笔( LayoutInflater.infalte)画出图案,再绘制在画布(addView)上!最后显示出来(setContentView)2.Activity,Task和Back Stack的一些概念接着我们来了解Android中Activity的管理机制,这就涉及到了两个名词:Task和Back Stack了!概念解析:我们的APP一般都是由多个Activity构成的,而在Android中给我们提供了一个Task(任务)的概念,就是将多个相关的Activity收集起来,然后进行Activity的跳转与返回!当然,这个Task只是一个frameworker层的概念,而在Android中实现了Task的数据结构就是Back Stack(回退堆栈)!相信大家对于栈这种数据结构并不陌生,Java中也有个Stack的集合类!栈具有如下特点:后进先出(LIFO),常用操作入栈(push),出栈(pop),处于最顶部的叫栈顶,最底部叫栈底而Android中的Stack Stack也具有上述特点,他是这样来管理Activity的:当切换到新的Activity,那么该Activity会被压入栈中,成为栈顶!而当用户点击Back键,栈顶的Activity出栈,紧随其后的Activity来到栈顶!我们来看下官方文档给出的一个流程图:流程解析:应用程序中存在A1,A2,A3三个activity,当用户在Launcher或Home Screen点击应用程序图标时,启动主A1,接着A1开启A2,A2开启A3,这时栈中有三个Activity,并且这三个Activity默认在同一个任务(Task)中,当用户按返回时,弹出A3,栈中只剩A1和A2,再按返回键,弹出A2,栈中只剩A1,再继续按返回键,弹出A1,任务被移除,即程序退出!接着在官方文档中又看到了另外两个图,处于好奇,我又看了下解释,然后跟群里的人讨论了下: 然后还有这段解释:然后总结下了结论:Task是Activity的集合,是一个概念,实际使用的Back Stack来存储Activity,可以有多个Task,但是同一时刻只有一个栈在最前面,其他的都在后台!那栈是如何产生的呢?答:当我们通过主屏幕,点击图标打开一个新的App,此时会创建一个新的Task!举个例子:我们通过点击通信录APP的图标打开APP,这个时候会新建一个栈1,然后开始把新产生的Activity添加进来,可能我们在通讯录的APP中打开了短信APP的页面,但是此时不会新建一个栈,而是继续添加到栈1中,这是Android推崇一种用户体验方式,即不同应用程序之间的切换能使用户感觉就像是同一个应用程序,很连贯的用户体验,官方称其为seamless (无缝衔接)!——————这个时候假如我们点击Home键,回到主屏幕,此时栈1进入后台,我们可能有下述两种操作:1)点击菜单键(正方形那个按钮),点击打开刚刚的程序,然后栈1又回到前台了!又或者我们点击主屏幕上通信录的图标,打开APP,此时也不会创建新的栈,栈1回到前台!2)如果此时我们点击另一个图标打开一个新的APP,那么此时则会创建一个新的栈2,栈2就会到前台,而栈1继续呆在后台;3) 后面也是这样...以此类推!3.Task的管理1)文档翻译:好的,继续走文档,从文档中的ManagingTasks开始,大概的翻译如下:1)文档翻译继续走文档,从文档中的ManagingTasks开始,翻译如下:如上面所述,Android会将新成功启动的Activity添加到同一个Task中并且按照以"先进先出"方式管理多个Task和Back Stack,用户就无需去担心Activites如何与Task任务进行交互又或者它们是如何存在于Back Stack中!或许,你想改变这种正常的管理方式。比如,你希望你的某个Activity能够在一个新的Task中进行管理;或者你只想对某个Activity进行实例化,又或者你想在用户离开任务时清理Task中除了根Activity所有Activities。你可以做这些事或者更多,只需要通过修改AndroidManifest.xml中< activity >的相关属性值或者在代码中通过传递特殊标识的Intent给startActivity( )就可以轻松的实现对Actvitiy的管理了。< activity >中我们可以使用的属性如下:taskAffinitylaunchModeallowTaskReparentingclearTaskOnLaunchalwaysRetainTaskStatefinishOnTaskLaunch你能用的主要的Intent标志有:FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP好的,接下来逐个介绍这些怎么用:2)taskAffinity和allowTaskReparenting默认情况下,一个应用程序中的所有activity都有一个Affinity,这让它们属于同一个Task。你可以理解为是否处于同一个Task的标志,然而,每个Activity可以通过< activity>中的taskAffinity属性设置单独的Affinity。不同应用程序中的Activity可以共享同一个Affinity,同一个应用程序中的不同Activity也可以设置成不同的Affinity。Affinity属性在2种情况下起作用:1)当启动 activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记:当传递给startActivity()的Intent对象包含 FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的Activity寻找与当前Activity不同Task。如果要启动的 Activity的Affinity属性与当前所有的Task的Affinity属性都不相同,系统会新建一个带那个Affinity属性的Task,并将要启动的Activity压到新建的Task栈中;否则将Activity压入那个Affinity属性相同的栈中。2)allowTaskReparenting属性设置为true如果一个activity的allowTaskReparenting属性为true, 那么它可以从一个Task(Task1)移到另外一

[1] [2] [3]  下一页


4.1.3 Activity登堂入室