安卓进阶-Activity的四种启动模式

我们在开发项目的过程中,会涉及到该应用中多个Activity组件之间的跳转,或者夹带其它应用的可复用的Activity。例如我们可能希望跳转到原来某个Activity实例,而不是产生大量重复的
Activity。这样就需要我们为 Activity 配置特定的加载模式,而不是使用默认的加载模式。

设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:<activity
android:name="ActB" android:launchMode ="singleTask"></activity>

Activity 有四种加载模式

[1] standard 模式

这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

例如:

若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……

点back键会依照栈顺序依次退出。

[2] singleTop 模式

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

若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。

若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)

若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。

[3] singleTask 模式

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。

如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

[4] singleInstance 模式

在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例(
会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。

“拿来主义”standard模式。哪里需要调用我我就去哪里,可以多次实例化,可以几个相同的Activity重叠。

“拒绝堆叠”singleTop模式。可以多次实例化,但是不可以多个相同的Activity重叠,当堆栈的顶部为相同的Activity时,会调用onNewIntent函数。

“独立门户”singleTask模式。同一个应用中调用该Activity时,如果该Activity没有被实例化,会在本应用程序的Task内实例化,如果已经实例化,会将Task中其上的Activity销毁后,调用onNewIntent;其它应用程序调用该Activity时,如果该Activity没有被实例化,会创建新的Task并实例化后入栈,如果已经实例化,会销毁其上的Activity,并调用onNewIntent。一句话,singleTask就是“独立门户”,在自己的Task里,并且启动时不允许其他Activity凌驾于自己之上。

“孤独寂寞”singleInstance模式。加载该Activity时如果没有实例化,他会创建新的Task后,实例化入栈,如果已经存在,直接调用onNewIntent,该Activity的Task中不允许启动其它的Activity,任何从该Activity启动的其他Activity都将被放到其他task中,先检查是否有本应用的task,没有的话就创建。

时间: 2024-10-12 04:22:41

安卓进阶-Activity的四种启动模式的相关文章

安卓中Activity的四种启动模式

Activity的四种启动模式 (示例图) 1.standard  标准的启动模式,在回退栈中,每次访问启动的activity都是一个全新的Activity.   2.singleTop     栈顶单一,在回退栈中,如果打开的Activity就是栈顶的Activity, 将重用栈顶的这个Activity.   3.singleTask     栈内唯一,在回退栈中,如果打开一个栈中已存在的Activity,它会把这个Activity之上的所有Activity都杀死,从而保证栈内唯一.   4.

转 Activity的四种启动模式和onNewIntent()

转自 http://blog.csdn.net/linghu_java/article/details/17266603 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Android总Activity的启动模式分为四种: Activity启动模式设置: <activity android:name=".MainActivity" a

Activity的四种启动模式区别

(1) standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中. (2) singleTop 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例. (3)singleTask 如果在栈中已经有该Activity的实例,就重用该实例.重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈.如果栈中不存在该实例,将会创建新的实例放入栈中. (

Android Activity:四种启动模式,Intent Flags和任务栈(转自他人博客)

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.那各个页面跳转关系如何决定呢?如果启动了顺序启动了ABCD的Activiy,如何从D调回到B呢?下面讲述一下Acitivity的四种启动模式.讲解启动模式之前,有必要先讲解一下“任务栈”的概念; 任务栈 每个应用都有至少一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity的出现顺序:比如Activity1-->Activity2-->Act

Android之Activity的四种启动模式

当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中.Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置. 1. Standared模式(默认) 我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的

Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags(); 一.Android Activity 四种启动模式 lunchMode 在Manifest 配置文件中的属性如下: (1) android:launchMode="standard" (2)android:launchMode="singleTop" (3)android:launchMode="singleTask" (4)andro

详解Activity的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Activity启动模式设置:<activity android:name=".MainActivity" android:launchMode="standard" /> Android总Activity的启动模式分为四种: Activity的四种启动模式:

activity的四种启动模式详细分析

1.android中通过任务队列来管理activity 采用栈的结构就是后进先出 手机里面如果启动多个应用就会启动多个任务栈来管理对应的activity. 主要解决下面的问题:对应的四种启动模式: 1.界面1去启动界面2,在界面2中再去启动界面1,是新创建一个界面1的实例,还是使用后来栈中的已经存在的实例,这就和界面1的设置的模式有很大的关系. 标准的模式:每次去调用都会产生一个新的实例,比如当前activity,你在当前的activity中点击按钮再创建当前的activity,在任务栈就会存在

知识总结: Activity的四种启动模式

通常情况下,一个应用有一个Task,这个Task就是为了完成某个工作的一系列Activity的集合.而这些Activity又被组织成了堆栈的形式.当一个Activity启动时,就会把它压入该Task的堆栈,而当用户在该Activity中按返回键,或者代码中finish掉时,就会将它从该Task的堆栈中弹出.然而,事实上我们的需求远没有我们想的那么简单.有时候,你可能希望在开启一个Activity时,重新开启一个Task:有时你可能希望将已经存在的一个Activity放到栈顶,而不是重新创建一个等