Android Activity启动模式(android:launchMode="")

来源:互联网 发布:马甲软件 编辑:程序博客网 时间:2024/06/06 09:26

Android Activity启动模式(android:launchMode="")
0

作者:樱蝴蝶更新于 04月28日访问(713评论(1

eoe客户端开源了,下载看看,先找入口,结果就在manifest里看到个android:launchMode="singleTask",一来就是个我没见过的,好吧,也可能书上有说过,但是好像重来就不用啊,只能去好好理解下了,刚好耗子也有提到过这个,就直接看了下她提供的链接,http://blog.csdn.net/leiswpu/article/details/6248528,这个里面说的确实比较容易明白,
为了省的还要跑过去看,也为了以防万一,我还是再复制一遍过来吧。。。

在Android的联机文档中,有对Activity的简单介绍,现在通过编写代码对Activity的启动模式做一个深入的理解。
在配置文件AndroidManifest.xml中,activity元素的android:launchMode属性用来配置对应Activity的启动模式,目前有以下四种启动模式:
1.standard
2.singleTop
3.singleTask
4.singleInstance
如果不对Activity设置启动模式,默认就是standard模式

一、standard

请看以下代码,实现了一个Activity :

 1 2 3 4 5 6 7 8 910111213141516171819202122232425
public class A_Activity extends Activity {     /** Called when the activity is first created. */     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         TextView textView=new TextView(this);         textView.setText(this+"");//这里用于打印当前Activity的hashcode,可以此判断Activity实例是不是同一个对象         Button button=new Button(this);         button.setText("Go next activity");         button.setOnClickListener(new OnClickListener(){            public void onClick(View v) {                 // TODO Auto-generated method stub                 Intent intent=new Intent();                 intent.setClass(A_Activity.this, A_Activity.class);//说明发出Intent与启动的Activity都是A_Activity的实例                startActivity(intent);             }         });         LinearLayout layout=new LinearLayout(this);         layout.setOrientation(LinearLayout.VERTICAL);         layout.addView(textView);         layout.addView(button);         setContentView(layout);     } } 

运行之,请看下图:
001.jpg
点击button后,注意看第一行的textView
002.jpg
由此可知,生成了新的A_Activity对象,这时我们按回退键,就会依次回到之前的Activity。点击button的过程就是压栈的过程,在standard模式下,就会不断生成新的Activity对象

二、singleTop

singleTop和standard模式都会将intent发送给新的Activity实例,不同的是,如果创建Intent的时候栈顶有要创建的singleTop模式下的Activity实例,则将Intent发送给该实例,不会再创建Activity的新实例。
还是使用之前的代码,只是设置A_Activity的启动模式为singleTop:android:launchMode="singleTop",运行之,请看下图:
003.jpg
这个时候我们无论点击多少次button,textView都显示同一个Activity实例,按回退键时会直接退出程序,表明在singleTop模式下,如果在栈顶存在Intent中那个目标Activity的实例,就不会创建新的实例,而直接使用栈顶的对象,对于资源有限的移动设备来说,也是有实际意义的。
如果是在不同Activity之间跳转,就会跟standard模式的情形一样,请看下面代码:

 1 2 3 4 5 6 7 8 910111213141516171819202122232425
public class A_Activity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView textView=new TextView(this);        textView.setText(this+"");        Button button=new Button(this);        button.setText("Go B_Activity");        button.setOnClickListener(new OnClickListener(){            public void onClick(View v) {                // TODO Auto-generated method stub                Intent intent=new Intent();                intent.setClass(A_Activity.this, B_Activity.class);//从A跳转到B                 startActivity(intent);            }        });        LinearLayout layout=new LinearLayout(this);        layout.setOrientation(LinearLayout.VERTICAL);        layout.addView(textView);        layout.addView(button);        setContentView(layout);    }}
 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829
public class B_Activity extends Activity {     /**<li>Description: </li>     *     * @param savedInstanceState     * @see android.app.Activity#onCreate(android.os.Bundle)     */    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        TextView textView=new TextView(this);        textView.setText(this+"");        Button button=new Button(this);        button.setText("Go A_Activity");        button.setOnClickListener(new OnClickListener(){             public void onClick(View v) {                // TODO Auto-generated method stub                Intent intent=new Intent();                intent.setClass(B_Activity.this, A_Activity.class);//从B跳转到A                startActivity(intent);            }        });        LinearLayout layout=new LinearLayout(this);        layout.setOrientation(LinearLayout.VERTICAL);        layout.addView(textView);        layout.addView(button);        setContentView(layout);    }}

运行后,如下图:
004.jpg
点击button后:
005.jpg
再点击button后:
006.jpg
这样每次都会创建目标Activity的新实例,因为在跳转时,处于栈顶的对象不是目标Activity的实例

三、singleTask

singleTask模式只能创建一个实例,当发送一个Intent,目标Activity为singleTask模式时,系统会检查栈里面是否已经有该Activity的实例,如果有就直接将Intent发送给它,还是使用(二)中的代码,将A_Activity启动模式设置为singleTask,B_Activity启动模式设置为standard,启动后如下图:
007.jpg
点击button后:
008.jpg
继续点击button:
009.jpg
由此可知,singleTask模式的A_Activity在栈中只有一个实例,可以被重复使用
并且,如果收到Intent生成一个新实例,那么用户可以通过回退键回到上一个状态,如果是已经存在的一个activity来处理这个Intent的话,就无法通过回退键回到上一个状态(对singleInstance同样适用) ,比如刚才最后一步如果再按回退键,就会直接退出程序,而不会回到上一步的状态。

四、singleInstance

这个模式下的Activity在一个单独的task栈中,这个栈也只能包含一个Activity的实例,将上面代码稍微改动一下,显示taskId:
A_Activity 中:textView.setText(this.getTaskId()+"");
B_Activity 中:textView.setText(this.getTaskId()+"");
另外将B_Activity 设置为singleInstance模式,A_Activity 设置为standard模式,启动后:
010.jpg
点击button后:
011.jpg
表明启动了新的task

总结四个模式的不同:
1、Intent的目标Activity由哪个task持有
standard与singleTop的Activity所在task,与收到的Intent的发送者所在task相同,除非Intent包括参数FLAG_ACTIVITY_NEW_TASK,该参数会启动Activity到新的task中;singleTask和singleInstance总是把Activity作为一个task的根元素,它们不会被启动到其他task里
2、是否允许Activity的多个实例
standard与singleTop可以被实例化多次,可以存在不同task中,并且一个task可以包括同一activity的多个实例
singleTask与singleInstance则在同一个task中只能允许Activity的一个实例,并且是task的根元素
3、在同一个task栈中,是否允许其他Activity的实例存在
singleInstance单独在一个task中,其他启动模式允许不同Activity的实例存在
4、是否每次生成新实例接收Intent
standard每次启动都会生成新实例
singleTop的activity如果在task的栈顶的话,则不生成新的activity实例,直接使用该实例,否则,就要生成新的实例
singleInstance在所在栈中是唯一的activity,它每次都会被重用
singleTask如果task栈中有该模式的Activity,就不生成新的activity实例,直接使用该实例,否则,就要生成新的实例

也看过一些自己找的,会有配图:
(1)standard

standard.gif

(2)singleTask
singleTask.gif

可以将TaskA TaskB理解为两个应用,比如TaskA是你当前的应用,TaskB是默认浏览器。
当到了TaskB中后,按返回键,需要先在TaskB中返回到root,然后才能返回到TaskA。

总结成以下几句:
standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)

singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用)

singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)

singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)

反正最好最快的理解方法就是写个例子,直接运行一下。。。

声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息

原文作者: 樱蝴蝶

原文地址: http://my.eoe.cn/yinghudie/archive/3184.html

原创粉丝点击