android的四种加载模式

原创 2015年07月10日 14:58:50

在多Activity开发中,有可能是自己应用之间的Activity跳转,也有可能夹带其他应用的可复用的Activity,可能会希望跳转到原来某个Activity实例,而不产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式。

Activity有四种加载模式,分别为:

1、standard:标准模式(默认模式),一调用startActivity()方法就会产生一个新的实例。

2、singleTop:如果Activity实例位于栈顶,就不产生新的实例,直接使用栈顶的实例,否则,就会产生一个新的实例。

例如:现在Task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动Intent,如果D是 “standard”模式的,则生成D的一个新实例,栈状态为A-B-C-D-D。如果D是singleTop模式的话,则不会生成D的新实例,栈状态仍为A-B-C-D。如果这时候给B发Intent的话,不管B的launchMode是“standard”还是“singleTop”,都会生成B的新实例,栈状态变为A-B-C-D-B。

3、singleTask:每次调用都会使用这个实例,不会去产生新的实例了。

4、singleInstance:跟singleTask模式基本上是一样,只有一个区别:在这个模式下的Activity实例与其他Activity处在不同的Task中,此实例所处的Task中只能有这个Activity实例,不能有其他的实例。

如何设置Activity的加载模式?

加载模式可以在清单文件AndroidManifest.xml中的<activity>的launchMode属性进行配置。

<activity
            android:name="ActivityOne"
            android:label="@string/app_name"
            android:launchMode="standard">
</activity>

四种加载模式的区别(示例说明):

1、standard模式,标准模式,也就是默认模式,不需要在launchMode属性配置。

复制代码
/**
 * 默认(standard)加载模式
 * 
 * @author Harvey
 */
public class ActivityOne extends Activity implements OnClickListener
{
    private TextView textView;// 显示文本
    private Button button;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button.setText("go to ActivityOne");
        button.setOnClickListener(this);
        textView.setText(this + "");
    }
    
    @Override
    public void onClick(View v)
    {
        Intent intent = new Intent();
        intent.setClass(ActivityOne.this, ActivityOne.class);// 跳转
        startActivity(intent);
    }
}
复制代码

 清单文件如下:

复制代码
<activity android:name="ActivityOne"
          android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
复制代码

经过多次点击按钮后,发现每次在界面上显示hash code值都不同,证明每次点击按钮都创建了该Activity的新实例。接着点击返回键,可以看到是按照刚才创建Activity实例的倒序依次出现,类似退栈的操作,而刚才操作跳转按钮的过程是压栈的操作。

2、singleTop模式,singleTop和standard模式都会将Intent发送新的实例(而后两种模式如果已经有了实例,就不会发送到新的实例)。不过,singleTop要求如果创建Intent的时候栈顶已经有要创建的Activity的实例,则将Intent发送给该实例,而不发送给新的实例。

复制代码
/**
 * singleTop模式
 * 
 * @author Harvey
 */
public class ActivityOne extends Activity implements OnClickListener
{
    private TextView textView;// 显示文本
    private Button button;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button.setText("go to ActivityOne");
        button.setOnClickListener(this);
        textView.setText(this + "");
    }
    
    @Override
    public void onClick(View v)
    {
        Intent intent = new Intent();
        intent.setClass(ActivityOne.this, ActivityOne.class);// 跳转
        startActivity(intent);
    }
}
复制代码

清单文件如下:

复制代码
<activity
            android:name="ActivityOne"
            android:label="@string/app_name"
            android:launchMode="singleTop">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
复制代码

点击Button按钮数次后,发现都是相同的Activity实例,因为该实例在栈顶,所有不会创建新的实例。如果点击返回键,将退出应用。singleTop模式,可用来解决栈顶多个重复相同的Activity的问题。

如果A-Activity跳转到B-Activity,再跳转到A-Activity,就和standard模式一样了,在B-Activity跳转到A-Activity的时候就会创建A-Activity的新实例,因为当时的栈顶不是A-Activity实例。

ActivityOne.java

复制代码
/**
 * singleTop模式
 * 
 * @author Harvey
 */
public class ActivityOne extends Activity implements OnClickListener
{
    private TextView textView;// 显示文本
    private Button button;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button.setText("go to ActivityTwo");
        button.setOnClickListener(this);
        textView.setText(this + "");
    }
    
    @Override
    public void onClick(View v)
    {
        Intent intent = new Intent();
        intent.setClass(ActivityOne.this, ActivityTwo.class);// 跳转
        startActivity(intent);
    }
}
复制代码

ActivityTwo.java

复制代码
public class ActivityTwo extends Activity implements OnClickListener
{
    private TextView textView;//显示文本
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button.setText("go to ActivityOne");
        button.setOnClickListener(this);
        textView.setText(this + "");
    }
    @Override
    public void onClick(View v)
    {
        Intent intent = new Intent();
        intent.setClass(ActivityTwo.this, ActivityOne.class);//跳转
        startActivity(intent);
    }
}
复制代码

清单文件如下:

复制代码
<activity
            android:name="ActivityOne"
            android:label="@string/app_name"
            android:launchMode="singleTop">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
<activity
            android:name="ActivityTwo"
            android:label="@string/app_name">
</activity>
复制代码

ActivityOne使用singleTop加载模式,ActivityTwo使用默认(standard)加载模式。ActivityOne也是要生成新的实例的,如果把ActivityOne的加载模式改为standard加载模式,结果也是一样。

3、singleTask模式,和后面的singleInstance模式都是只创建一个实例的。

当Intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例,如果有直接将Intent发送给它。

把上面singleTop的实例中的ActivityOne的launchMode改为singleTask,ActivityTwo不改动。

复制代码
<activity
            android:name="ActivityOne"
            android:label="@string/app_name"
            android:launchMode="singleTask">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
<activity
            android:name="ActivityTwo"
            android:label="@string/app_name">
</activity>
复制代码

多次跳转之后,发现Task中始终只有一个ActivityOne实例。

4、singleInstance模式

将ActivityOne的模式配置为standard模式,将ActivityTwo的模式配置为singleInstance模式。

ActivityOne.java

复制代码
/**
 * singleInstance模式
 * 
 * @author Harvey
 */
public class ActivityOne extends Activity implements OnClickListener
{
    private TextView textView;// 显示文本
    private Button button;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button.setText("go to ActivityTwo");
        button.setOnClickListener(this);
        textView.setText(this + "\n" + "task id:" + this.getTaskId());
    }
    
    @Override
    public void onClick(View v)
    {
        Intent intent = new Intent();
        intent.setClass(ActivityOne.this, ActivityTwo.class);// 跳转
        startActivity(intent);
    }
}
复制代码

ActivityTwo.java

复制代码
public class ActivityTwo extends Activity implements OnClickListener
{
    private TextView textView;// 显示文本
    private Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView = (TextView) findViewById(R.id.textView);
        button = (Button) findViewById(R.id.button);
        button.setText("go to ActivityOne");
        button.setOnClickListener(this);
        textView.setText(this + "\n" + "task id:" + this.getTaskId());
    }
    
    @Override
    public void onClick(View v)
    {
        Intent intent = new Intent();
        intent.setClass(ActivityTwo.this, ActivityOne.class);// 跳转
        startActivity(intent);
    }
}
复制代码

清单文件如下:

复制代码
<activity
            android:name="ActivityOne"
            android:label="@string/app_name">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />
                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>
<activity
            android:name="ActivityTwo"
            android:label="@string/app_name"
            android:launchMode="singleInstance">
</activity>
复制代码

经过多次的跳转发现ActivityOne和ActivityTwo的task id不相同,表明两个的Acitity不在同一个Task中。ActivityOne的hash code值在每次跳转之后都不同,表明每次跳转后都会创建一个新的ActivityOne实例,ActivityTwo的hash code值每次跳转之后都相同,表明ActivityTwo所在的Task中只有一个ActivityTwo实例。


Android四种常见设计模式说明

前言:        Android开发的设计模式,基本设计思想源于java的设计模式,java的设计模式有N多种,据不完全统计,迄今为止,网络出现最频繁的大概有23种。Java只是一门开发语言,学...
  • xiyangyang8
  • xiyangyang8
  • 2016年04月04日 01:39
  • 2012

android学习-动画(基本的四种动画)

先看段关于android中动画配置文件的伪代码: 现在来慢慢理清楚: xmlns:andr...
  • Main_Stage
  • Main_Stage
  • 2013年07月24日 11:47
  • 2492

Java四种引用详解

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 1.强引用 本章前文介绍的引用实际上...
  • NicolasYan
  • NicolasYan
  • 2016年03月10日 00:20
  • 1774

Android数据的四种存储方式SharedP…

除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data...
  • bingo_1214
  • bingo_1214
  • 2015年04月09日 17:22
  • 691

Activity 四种启动模式的区别

Android Activity 四种启动模式的区别 分享到: 通过昨天的学习,相信大家已经对Android Activity的四种启动模式有了非常清楚的认识,那么,Android...
  • zhang31jian
  • zhang31jian
  • 2013年12月17日 17:00
  • 4406

Android四种补间动画介绍及实现

一.Android的animation由四种类型组成:alpha、scale、translate、rotate alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动...
  • romanstatic
  • romanstatic
  • 2016年09月10日 09:35
  • 1491

Android 四种线程池

为什么要使用线程池 当同时并发多个网络线程时,引入线程池技术会极大地提高APP的性能。 显著减少了创建线程的数目。 防止内存过度消耗。控制活动线程的数量,防止并发线程过多。 使用条件:假设在一台AP...
  • qq_17250009
  • qq_17250009
  • 2016年03月16日 16:51
  • 9962

Activity四大基本状态

Activity四大基本状态 Activity生命周期一般分为四个基本状态,分别是活动状态(running),暂停状态(paused),停止状态(stopped)和死亡状态。 1.活动状态...
  • u014070729
  • u014070729
  • 2016年03月12日 21:15
  • 2187

java android之各种流

1. 处理的数据单位不同,可分为:字符流,字节流 2.数据流方向不同,可分为:输入流,输出流 3.功能不同,可分为:节点流,处理流 节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文...
  • caojing3231509
  • caojing3231509
  • 2016年09月20日 21:10
  • 161

浅谈Activity的四种启动模式

本文主要聊聊Activity的四种启动模式,请看文章!
  • itluochen
  • itluochen
  • 2016年09月20日 19:31
  • 1484
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android的四种加载模式
举报原因:
原因补充:

(最多只允许输入30个字)