Activity启动模式

来源:互联网 发布:网络大专多少钱一年 编辑:程序博客网 时间:2024/06/06 09:57

本章参考《Android艺术探索》

standard:默认启动模式,每次启动都创建一个实例到启动它的activity的栈中,A(Activity)启动B(Activity),那么B就会运行在A所在的栈中,如果为非Activity类型的Context启动Activity,它并没有任务栈,则需要制定一个FLAG_ACTIVITY_NEW_TASK标记位,创建一个新的任务栈。

这里写图片描述


singleTop:栈顶复用模式:如果要启动的Activity已经位于栈顶,则不会重新创建,同时它的onNextIntent()方法会被回调。A启动A,直接使用,不会重新创建一个A的实例。

这里写图片描述

singleTask:栈内复用模式;是一种单实例模式,只要Activity在一个栈中存在,那么多起启动此Activity都不会重新创建实例,也会回调onNextIntent()方法;这个启动模式有三种状况:
1、启动B,B需要的任务战为S2,A所在的任务栈为S1(CDA),这时候就要创建任务栈S2,然后创建B的实例并将B的实例入栈到S2(B);
2、同上,假设B所需要的任务战为S1(CDA),则将创建B的实例并将B的实例入栈到S1(CDAB);
3、假设B所需要的任务战为S1,S1(CBDA),此时S1中存在B的实例,则出栈B上面的元素,最终S1(CB);

singleInstance:单实例模式;一种加强的singleTask模式,具有此种模式的Activity只能单独的位于一个任务栈中;启动B(该模式),系统为他新创建一个任务栈,然后B独自在这个新的任务栈中,由于栈内复用的特性,后续的请求不会创建新的Activity,除非这个任务栈被系统销毁了。
示例:
前台任务栈(AB),后台任务栈(CD),现在请求启动D,则后台切换到前台,后退时,DCBA
同上,现在请求启动C,后台切换到前台,同时出栈D,后台时,CBA


其中有提到所需要的任务栈,什么是所需要的任务栈:
TaskAffinity:任务相关性
默认情况下,所有的Activity所需要的栈的名字为应用的包名,使用TaskAffinity属性可以指定一个任务栈的名称,但是不能喝包名相同(不然你做这个操作有什么意义,相当于没做);这个属性主要是和singleTask启动模式或者allowTaskReparenting配合使用:
和singleTask时可指定任务栈的名称;
和allowTaskReparenting时,比较麻烦:A应用启动B应用的某个activity,如果该Activity的allowTaskReparenting=”true”,则当B应用启动后,该Activity会从应用A的任务栈中转移到应用B的任务战中。
示例:两个应用A、B(不是Activity),A启动B中的C(Activity),回到桌面后点B应用,进入的并不是B的首页,而是C页面,应为C已经从A的任务栈中转移到了B的任务栈中。


Activity中的Flag:
FLAG_ACTIVITY_NEW_TASK:singleTask
FLAG_ACTIVITY_SINGLE_TOP:singleTop
FLAG_ACTIVITY_CENTER_TOP:当他启动时,在他之上的Activity都要出栈。和singleTask一块合作时,如果Activity实例已经存在,则会回调它的onNextIntent,由于栈内复用性,出栈他之上的;如果和standard合作,如果该Activity实例已经存在,则出栈它和它之上的,然后创建新实例并入栈顶。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:不会出现在历史列表中,ABC顺序启动,回退时CA,等同于在xml中:

android:excludeFromRecents="true"


IntentFilter的匹配规则:
IntentFilter的过滤信息有:action、category、data
只有一个Intent同时匹配这三个类别才算完全匹配,一个Activity有多组intent-filter,只要匹配一组就可以

action:可以有多个action,只要和一个action匹配成功即可,有系统预定义,也可自定义,必须要指定;
category:必须要全部匹配才行,可以不指定,系统会给一个默认的:android.intent.category.DEFAULT;
data:同action,要指定一些规则,不过使用较少,仅作了解。

入口Activity就指定了action和category:

<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />


原创粉丝点击