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

一、standard

请看以下代码,实现了一个Activity :
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);
    }
}
运行之,请看下图:

点击button后,注意看第一行的textView

由此可知,生成了新的A_Activity对象,这时我们按回退键,就会依次回到之前的Activity。点击button的过程就是压栈的过程,在standard模式下,就会不断生成新的Activity对象

二、singleTop

singleTop和standard模式都会将intent发送给新的Activity实例,不同的是,如果创建Intent的时候栈顶有要创建的singleTop模式下的Activity实例,则将Intent发送给该实例,不会再创建Activity的新实例。
还是使用之前的代码,只是设置A_Activity的启动模式为singleTop:android:launchMode="singleTop",运行之,请看下图:

这个时候我们无论点击多少次button,textView都显示同一个Activity实例,按回退键时会直接退出程序,表明在singleTop模式下,如果在栈顶存在Intent中那个目标Activity的实例,就不会创建新的实例,而直接使用栈顶的对象,对于资源有限的移动设备来说,也是有实际意义的。
如果是在不同Activity之间跳转,就会跟standard模式的情形一样,请看下面代码:
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);
    }
}
public class B_Activity extends Activity { 
    /**

  • Description:

  •      *
         * @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);
        }
    }
    运行后,如下图:

    点击button后:

    再点击button后:

    这样每次都会创建目标Activity的新实例,因为在跳转时,处于栈顶的对象不是目标Activity的实例

    三、singleTask

    singleTask模式只能创建一个实例,当发送一个Intent,目标Activity为singleTask模式时,系统会检查栈里面是否已经有该Activity的实例,如果有就直接将Intent发送给它,还是使用(二)中的代码,将A_Activity启动模式设置为singleTask,B_Activity启动模式设置为standard,启动后如下图:

    点击button后:

    继续点击button:

    由此可知,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模式,启动后:

    点击button后:

    表明启动了新的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. 判断AccessibilityService服务是否已经启动
    2. 简单说明View
    3. Android(安卓)启动过程
    4. Android事务 IMMEDIATE与EXCLUSIVE模式
    5. OpenGL ES 纹理过滤模式-glTexParameteri
    6. Android四种Activity的加载模式
    7. paip.android环境搭建与开发事例
    8. Android快速SDK(15)二维码扫描Scanner【傻瓜模式】
    9. android service 学习(上)

    随机推荐

    1. Android中图像变换Matrix的原理、代码验
    2. Android(安卓)Studio一些控件的使用
    3. Android(安卓)Intent 大全
    4. android image 压缩和解压
    5. Android开发之文件下载
    6. Android(安卓)数据操作之SQLiteDatabase
    7. Android(安卓)Develop Tips
    8. Android(安卓)build.prop生成过程
    9. Android——Pull方式解析XML数据
    10. Android(安卓)官方示例:android-architect