Activity任务堆栈 四种launchMode

 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数据, 变成:

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/totome/archive/2012/08/31/2665024.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值