Activity的启动模式---总结

Activity有四种启动模式:

1.standard(标准)    2.singleTop    3.singleTask  4.singleInstance

标识某个Activity的启动模式,有两种方式:

1.一种是通过AndroidManifest.xml    2.一种是通过Intent的标识

通过AndroidManifest.xml来标识:

  1. <activity android:name=".Activity1"
  2. android:launchMode="standard"
  3. android:label="@string/app_name">
  4. <intent-filter>
  5. <action android:name="android.intent.action.MAIN" />
  6. <category android:name="android.intent.category.LAUNCHER" />
  7. </intent-filter>
  8. </activity>

通过Intent的Flag来标识:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_CLEAR_TOP

-------------------------------------------------------------------------------------------------------------------------------------

standard模式

"standard" (the default mode)
Default. The system creates a new instance of the activity in the task from which it was started and routes the intent to it. The activity can be instantiated multiple times, each instance can belong to different tasks, and one task can have multiple instances.

比如,Activity1的启动模式是standard,那么,通过Intent去启动Activity1的时候,不管当前的task中是否包含了Activity1,也不管当前的栈顶中是否有Activity1,总之,系统会创建一个新的Activity1对象。

实验的例子:

AndroidManifest.xml里Activity的设置如下:

<activity

android:name="com.testlaunchemode.activity.ActivityStandard"

android:launchMode="standard"

/>

代码如下:

public class ActivityStandard extends Activity {

private TextView tv ;

public void onCreate(Bundle state) {

super.onCreate(state);

setContentView(R.layout. standard_activity);

MyApp app = (MyApp) getApplicationContext();

tv = (TextView) findViewById(R.id. tv_result);

tv.setText( "Activity launched in standard mode,This is times result from Application: "

+ app.inCreaseTimes());

}

public boolean onTouchEvent(MotionEvent event) {

Intent intent = new Intent(this , ActivityStandard.class);

startActivity(intent);

return super .onTouchEvent(event);

}

}

每次点击ActivityStandard的界面,就会再次生成一个新的ActivityStandard对象。

这个,可以通过,我们按返回按钮得到的效果来证实。我们,按下返回按钮时,会不断返回到上一个Activity,而上一个Activity的外观跟ActivityStandard的外观是一样的。由此,可以得出,是不断创建ActivityStandard。

如果点击四次,进来的时候那个ActivityStandard不是通过点击触发的,那么,在task中,在栈中就是:

ActivityStandard

ActivityStandard

ActivityStandard

ActivityStandard

ActivityStandard

----------------------------------------------------------------------------------------------------------

singleTop模式

If an instance of the activity already exists at the top of the current task, the system routes the intent to that instance through a call to its onNewIntent() method, rather than creating a new instance of the activity. The activity can be instantiated multiple times, each instance can belong to different tasks, and one task can have multiple instances (but only if the activity at the top of the back stack is not an existing instance of the activity).

For example, suppose a task‘s back stack consists of root activity A with activities B, C, and D on top (the stack is A-B-C-D; D is on top). An intent arrives for an activity of type D. If D has the default "standard"launch mode, a new instance of the class is launched and the stack becomes A-B-C-D-D. However, if D‘s launch mode is "singleTop", the existing instance of D receives the intent through onNewIntent(), because it‘s at the top of the stack—the stack remains A-B-C-D. However, if an intent arrives for an activity of type B, then a new instance of B is added to the stack, even if its launch mode is "singleTop".

Note: When a new instance of an activity is created, the user can press the Back button to return to the previous activity. But when an existing instance of an activity handles a new intent, the user cannot press the Back button to return to the state of the activity before the new intent arrived in onNewIntent().

比如ActivitySingleTop是设定为启动模式是singleTop的,

然后,当前的栈顶是有ActivitySingleTop类型的对象;然后,其它Activity要启动ActivitySingleTop,那么,此时,系统不会重新创建ActivitySingleTop对象,而是直接使用位于栈顶的ActivitySingleTop对象。

也就是说,如果要启动的Activity,它的启动模式是SingleTop,并且,当前栈顶已经有该Activity了,那么,系统就不会创建新的Activity,这一点与standard启动模式的效果不同。

例子:

<activity

android:name="com.testlaunchemode.activity.ActivitySingleTop"

android:launchMode="singleTop"

/>

代码:

public class ActivitySingleTop extends Activity {

private TextView tv ;

private MyApp myApp ;

public void onCreate(Bundle state) {

super.onCreate(state);

setContentView(R.layout. singletop_activity);

inital();

}

private void inital() {

tv = (TextView) findViewById(R.id. tv);

myApp = (MyApp) getApplicationContext();

tv.setText( "SingleTop launchMode, times:" + myApp .inCreaseTimes());

}

public boolean onTouchEvent(MotionEvent event) {

Intent intent = new Intent(this , ActivitySingleTop.class);

startActivity(intent);

return super .onTouchEvent(event);

}

@Override

protected void onNewIntent(Intent intent) {

setTitle( "I am Activity1 too, but I called onNewIntent!" );

super.onNewIntent(intent);

}

}

效果:

首次进入:

此时在栈顶的是ActivitySingleTop类型的对象,即是当前Activity:

然后,我触摸当前Activity多次,下面的的times依然保持0:

这说明,在启动ActivitySingleTop时,并没有创建新的ActivitySingleTop对象,而是使用当前位于栈顶的ActivitySingleTop对象。系统会将调用者发出的intent,作为参数,传递给位于栈顶的ActivitySingleTop对象的onNewIntent方法。

注意:如果被调用的Activity(使用singleTop启动模式)不是处于栈顶,那么,不具备上述效果。

然后,我按下返回键,就直接返回到其他Activity。

-----------------------------------------------------------------------------------------------------

singleTask模式

"singleTask"
The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.

Note: Although the activity starts in a new task, the Back button still returns the user to the previous activity.

As another example, the Android Browser application declares that the web browser activity should always open in its own task—by specifying the singleTask launch mode in the <activity> element. This means that if your application issues an intent to open the Android Browser, its activity is not placed in the same task as your application. Instead, either a new task starts for the Browser or, if the Browser already has a task running in the background, that task is brought forward to handle the new intent.

Regardless of whether an activity starts in a new task or in the same task as the activity that started it, the Back button always takes the user to the previous activity. However, if you start an activity that specifies the singleTask launch mode, then if an instance of that activity exists in a background task, that whole task is brought to the foreground. At this point, the back stack now includes all activities from the task brought forward, at the top of the stack. Figure 4 illustrates this type of scenario.

Figure 4. A representation of how an activity with launch mode "singleTask" is added to the back stack. If the activity is already a part of a background task with its own back stack, then the entire back stack also comes forward, on top of the current task.

被启动的Activity,如果它的启动模式是singleTask,那么:

1.如果在某个task中,包含该Activity,那么,会将intent传递到该Activity的onNewIntent()方法。

2.如果,没有task是包含该Activity的,那么,系统就创建一个新的task,然后,新创建的Activity实例,作为新的task的根activity。

例子1:将被启动的Activity,已经存在于当前的task中。

首次启动ActivitySingleTask:

然后,启动另外一个Activity:

然后,再启动ActivitySingleTask:

由此可以知道,如果要启动的ActivitySingleTask已经在task中了,那么,系统会将Intent传递给该

task中的ActivitySingleTask实例,不会再次创建一个新的ActivitySingleTask实例。

所以,在当前task中,只有一个ActivitySingleTask实例。所以,启动模式SingleTask,如其名字,可以解释为,

在该Activity所在的task中,该Activity只存在一个实例。

例子2:在同一个应用中,在当前task中,并没有ActivitySingleTask实例存在的情况下

首先启动一个standard Activity:

然后,再启动一个在当前task中并不存在的singleTask Activity:

通过taskId可以判断出,这两个Activity是位于同一个task的。事实上,在同一个应用下,当前task如果没有ActivitySingleTask2类型的实例时,系统并不会创建一个新的task来存放ActivitySingleTask2实例。系统只是将创建好的ActivitySingleTask2实例,存放在当前task中。

【The system creates a new task and instantiates the activity at the root of the new task】

文档中的这句话,如果一个启动模式是SingleTask的Activity与启动者是在同一个应用下,那么,就不成立。

例子3,将要被启动的SingleTaskActivity,与启动者是在不同的应用中

首先,创建一个app,其中包含将要被启动的SingleTaskActivity:

然后,在另外一个app中,启动OneApp中的Cactivity:

然后,调用的结果就是:

然后,不断的返回,会返回到Bactivity,Aactivity,这两个Activity都和Cactivity处于同一个task中。

从上述结果可以知道,如果被启动的Activity,它的启动模式是SingleTask,并且它在其它应用中,那么,

被启动Activity和启动Activity是属于不同的task的;此外,如果SingleTask Activity所在的task,是background状态的,那么,会将整个task变为forward 状态。

如下图所示:

---------------------------------------------------------------------------------------------------------------------------------------------

singleInstance模式

Same as "singleTask", except that the system doesn‘t launch any other activities into the task holding the instance. The activity is always the single and only member of its task; any activities started by this one open in a separate task.

如果某个Activity,假设是singleInstanceActivity,设定为singleInstance模式,那么,当singleInstanceActivity被启动后,系统会创建一个新的task,专门只用来存放singleInstanceActivity实例。

并且,当singleInstanceActivity启动其它Activity时,其它Activity实例,是放在一个新的task中,不会与singleInstanceActivity存放在同一个task中。也就是说,一个task中,只有singleInstanceActivity一个实例。

例子:

首先,启动该该singleInstanceActivity:

然后,启动另外一个Activity:

然后,再启动singleInstanceActivity:

由上可知,singleInstance是独占一个task的;然后,如果系统已经存在一个task,该task已经包含ActivitySingleInstance实例,那么,系统,会将启动ActivitySingleInstance的Intent传递给该实例,这时,调用的就是该实例的onNewIntent方法,不会再创建一个新的ActivitySingleInstance实例。

------------------------------------------------------------------------------------------

时间: 2024-12-19 02:56:24

Activity的启动模式---总结的相关文章

Activity的启动模式

Activity的四种启动模式: 在AndroidManifest.xml中给Activity进行配置,配置代码: android:launchMode="" 四种模式:Standard.singleTop.SingleTask.singleInstance 模式一 standard模式:没有在AndroidManifest.xml文件中配置,或者配置为android:launchModel="standard". 当启动一个Activity activity的时候

无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCreate()开始,直到调用onDestory()为止.Activity在onCreate()中设置所有“全局”状态以完成初始化. 而在onDestory()中释放所有系统资源.例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程, 而在onDestory()销

Activity的启动模式与flag详解

Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance.以下逐一举例说明他们的区别: standard:Activity的默认加载方法,即使某个Activity在 Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中.例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D .此时如

任务栈 Activity的启动模式 Intent中的Flag taskAffinity

关于任务栈Task 栈的概念 栈(Stack)是一种常用的数据结构,栈只允许访问栈顶的元素,栈就像一个杯子,每次都只能取杯子顶上的东西,而对于栈就只能每次访问它的栈顶元素,从而可以达到保护栈顶元素以下的其他元素."先进后出"或"后进先出"就是栈的一大特点,先进入栈的元素总是要等到后进入栈的元素出栈以后才能出栈.递归就是利用到了系统栈,暂时保存临时结果,对临时结果进行保护. 栈的基本操作:压栈.弹栈 任务栈 Task简单的就是一组以栈的模式聚集在一起的Activity

关于activity的启动模式

在Android中每个界面都是一个Activity ,界面的切换实际上是对不同Activity实例化的过程.而启动模式就决定Activity启动运行方式. 1.设置方式它是在主配置文件中,Activity标签下的一个属性:android:launchMode=""2.属性值:standard (标准,默认) 如果不设置一个Activity的启动模式,则该Activity默认的启动模式就是standard,该模式下,每次启动一个该Activity都会实例化一个新的Activity对象,并

Android开发之Activity的启动模式

黑发不知勤学早,白首方悔读书迟.--<劝学> 今天花了整个下午+晚上的的时间学习了Activity的启动模式,本来以为这个知识点很简单,但是在学习的过程中发现,Activity的启动模式并没有自己想象的那么简单,下面我们一起来看看这Activity的四种启动模式吧,如有疑问欢迎留言,如有谬误欢迎大家批评指正,谢谢 Activity的启动模式共有四种 1.standard 2.singleTop 3.singleTask 4.singleInstance 如图所示: LaunchMode在多个A

android Activity的启动模式 作用简析+demo详解

笔者近期做的一个项目用到了Activity的启动模式,也算是第一次深刻地领会到了其强大与方便.在此也是将自己所得与大家分享,自己写了一个比较简易的demo,便于让大家理解. 此篇博客意在让对启动模式不了解的开发者对其有一个较为形象的认识,至于深入探究,笔者还是推荐去看任玉刚前辈所写的<android开发艺术探索>了. 网上对Activity的启动模式讲解的博客有很多,但是大部分都需要掌握"栈"的知识,而且很多并不是那么通俗易懂.笔者打算独辟蹊径,一方面通过百度地图讲其作用,

Android笔记(五) Activity的启动模式

Android中Activity是由返回栈来管理的,在默认情况下,每当启动一个新的Activity,它都会在返回栈中入栈,并且出于栈的顶端.但是有些时候Activity已经在栈的顶端了,也就不需要再启动的时候重新创建一个Activity的实例了,所以我们就需要其他的启动方式. Activity的启动方式一共分为四种:standard.singleTop.singleTask.singleInstance,可以在AndroidManiFest.xml中通过<activity>标签指定androi

思考一下activity的启动模式

在android里,有4种activity的启动模式,分别为:"standard" (默认) "singleTop" "singleTask" "singleInstance" standard.singleTop.singleTask.singleInstance(其中前两个是一组.后两个是一组),默认为standard standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity. sing