Activity启动模式

来源:互联网 发布:软件p光头 编辑:程序博客网 时间:2024/06/05 17:32

开始

下面来讨论一下Activity的4种启动模式:

1.standard(系统默认),

2.singleTop,

3.singleTask,

4.singleInstance,

了解Activity启动模式之前,先补充一下Android中task容器栈的知识,其实就是Activity的一个容器集合,所有的Activity实例都是存放在这个容器栈里面。其实就是数据结构中栈是一个原理:先进后出,后进先出,所有操作都是发生在栈顶。

现在假设有4个Activity:A,B,C,D

standard模式

standard模式是默认的启动模式。

伪代码如下 :

StartActivity(A);StartActivity(B);StartActivity(C);StartActivity(D);

执行完后Activity栈中是这样的,如下图:

singleTop模式

如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

举例说明:(现在假设A是singleTop模式)

伪代码如下:

StartActivity(A);StartActivity(A);StartActivity(B);StartActivity(A);StartActivity(A);

执行完后Activity栈中是这样的,如下图:

singleTask模式

被启动的Activity在同一个Task内只有一个Activity实例,具体分为如下三种情况:

<1>.如果启动的目标Activity不存在Task栈中,系统将会创建一个目标Activity实例,并将它加入到Task栈顶

<2>.如果启动的目标Activity已存在Task栈顶,此时模式和singleTop模式相同

<3>.若果启动的目标Activity已存在但没有位于Task栈顶,系统将会把该目标Activity上面的所有Activity移除Task栈,使该Activity置于Task栈顶

举例说明(现在假设A是singleTask模式)

StartActivity(A);StartActivity(B);StartActivity(c);StartActivity(D);StartActivity(A);

singleInstance模式

这种加载模式下,无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来装载该Activity实例。具体可分为两种情况:

<1>.如果创建的目标Activity不存在,系统先会创建一个全新的Task,接着创建一个Activity实例,然后将该目标Activity加入到新的Task栈顶

<2>.如果创建的目标Activity已经存在,无论在哪个Task栈中,系统将会把Activity所在的栈置于前台。

注意:采用singleInstance加载模式的Activity总是位于Task栈顶,并且Activity所在的Task栈只包含该Activity。

举例说明(现在假设A是singleInstance模式)

StartActivity(A);StartActivity(B);StartActivity(c);StartActivity(A);StartActivity(D);

请注意:有以下几点奇怪的地方需要注意

1.执行完上面代码后,如果现在我们一步一步的返回,顺序是这个的D->C->B->主页->A
2.执行完上面代码后,如果从D返回应该是到C,而不是到A!
3.执行完上面代码后,如果用户点击了Home键,则再也回不到A的界面了。如果想解决这个问题,可以为A在Manifest.xml文件中的声明加上:

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

加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击A的那个图标就能回到它的界面(比如A中有一个EditText,以前输入的内容,现在回到之后依然存在)。

intent-filter中

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

两个过滤条件缺一不可,才会在程序列表中添加一个图标,图标下的显示文字是android:label设定的字符串。

结尾

好了就说到这吧,谢谢大家指正。

1 0