1 /** 2 * 演示一:FLAG_ACTIVITY_NEW_TASK 3 * 当传递给startActivity()的Intent对象包含 FLAG_ACTIVITY_NEW_TASK 标记时, 4 * 系统会为需要启动的activity寻找与当前activity不同的task。 5 * 如果要启动的 activity的affinity属性与当前所有的task的affinity属性都不相同, 6 * 系统会新建一个带那个affinity属性的task, 将要启动的activity压到新建的task栈中; 7 * 否则将activity压入那个affinity属性相同的栈中。 8 * 9 * AndroidManifest.xml 中配置:android:taskAffinity="com.great" 10 */ 11 // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 12 // startActivity(intent); 13 14 15 /** 16 * 演示二:FLAG_ACTIVITY_CLEAR_TOP 17 */ 18 // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 19 // startActivity(intent); 20 21 22 /** 23 * 演示三:FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 24 * 为任务栈设置一个还原点,目标及目标以上的Activity被清除,当用Home键回到主界面后,再次打开应用程序,这时会 25 * 定位在,被设置了还原点的 activity 上 26 */ 27 // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 28 // startActivity(intent); 29 30 31 /** 32 * 演示四:FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 33 * 设置了该 FLAG 后,这个 Activity 所在的任务栈如果还存在,则将任务栈带到前台,或新产生任务, 34 * 注:如果在点 HOME 键后(也就是这个任务栈到后台运行状态),这个 Activity 所在的任务栈就算被 kill 掉, 35 * 如果重新启动该应用,这个任务栈又会恢复到被放入后台运行时的状态,也就是相当于拷贝了原来的任务栈的状态 36 */ 37 // intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 38 // startActivity(intent); 39 40 41 /** 42 * 演示五:FLAG_ACTIVITY_SINGLE_TOP 43 * 目标栈里面如果有该activity实例,则重用;否则重新生成一个实例,压入栈顶 44 */ 45 Intent intent = new Intent(OneActivity.this, OneActivity.class); 46 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 47 startActivity(intent);
Activity属性
Standard和SingleTop一组,唯一的不同就是目标Activity在栈顶的话,后者的实例将被重用;
1、startard:默认模式,不需要配置launchMode,启动一个Activity就创建一个实例。
2、singleTop:将intent发送新的实例,要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。Intent被目标Activity接收处理,触发onNewIntent。
1 /** 2 * 3 * 函数名称 : registerListener 4 * 功能描述 : 注册监听 5 * 参数及返回值说明: 6 * 7 * 修改记录: 8 * 日期:2012-1-3 下午11:00:57 修改人:gy 9 * 描述 : 10 * 11 */ 12 private void registerListener() 13 { 14 btnGoToLaunchMode_SingleTop_Demo1.setOnClickListener(new OnClickListener() 15 { 16 @Override 17 public void onClick(View v) 18 { 19 Intent intent = new Intent(LaunchMode_SingleTop_Demo1.this, LaunchMode_SingleTop_Demo1.class); 20 startActivity(intent); 21 } 22 }); 23 } 24 25 /** 26 * 函数名称 : onNewIntent 27 * 功能描述 : 28 * 参数说明: 29 * @param intent 30 * 返回值: 31 * 32 * 修改记录: 33 * 日期:2012-1-4 下午11:35:41 修改人:gy 34 * 描述 : 35 * 36 */ 37 @Override 38 protected void onNewIntent(Intent intent) 39 { 40 super.onNewIntent(intent); 41 System.out.println("onNewIntent:" + count); 42 }
1 <activity android:name="LaunchMode_SingleTop_Demo1" android:launchMode="singleTop"> 2 3 <intent-filter> 4 <action android:name="android.intent.action.MAIN"/> 5 <category android:name="android.intent.category.LAUNCHER"/> 6 </intent-filter> 7 8 </activity>
3、singleTask:是在一个task中共享一个Activity,在Task范围内只产生一个实例。 如果任务栈中有该activity存在,则不会产生新实例,而是触发onNewIntent,并且目标以上的Activity被清除
4、singleInstance:在全局范围内只有一个,即使在不同apk中调用。
未标明launchMode的Activity都是默认启动模式
1,standard
每次都会新建一个Activity实例
2,singleTask
栈空间简易示意:A -- B -- C
最后用startActivity(intent)从C跳到A后,由于栈空间已经存在A的实例,A上面的Activity B和C出栈(即onDestroy销毁),A置于栈顶
如果A中重写了onNewIntent(...)方法,会同时接到C跳A的intent数据
3,singTop
栈空间简易示意:A -- B -- C
最后用startActivity(intent)从C跳到A后,即使栈控件已经存在A的实例,Android系统也会重新创建一个A的实例并且置于栈顶,当然重写的onNewIntent(...)方法也不会接到intent数据, 变成: