Activity启动模式(launchMode)详解

Activity 的启动模式有四种,standard、singleTop、singleTask、singleInstance.

image.png

1.standard

  standard是Activity默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种启动模式。
  每次启动都一个新的Activity位于栈顶。
  android:launchMode="standard",此时每次点击按钮都会创建新的Activity

现在,我们写一个简单的按钮 ,实现跳转Activity

    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("MainActivity",this.toString());
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
    }

虽然跳转的页面相同,但是在Task中每点一次按钮就会创建一个新的Activity

Activity创建日志

启动示例图

2.singleTop

当Activity的启动模式为singleTop时,当启动的Activity已经处于Activity栈顶时,则直接使用。
android:launchMode="singleTop"

我们创建NextActivity,并且在MainActivity中添加button2

    private Button button1,button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("MainActivity", this.toString());
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button1:
                Intent intent = new Intent(MainActivity.this, MainActivity.class);
                startActivity(intent);
                break;
            case R.id.button2:
                Intent intent2 = new Intent(this, NextActivity.class);
                startActivity(intent2);
                break;
        }
    }

此时在MainActivity中启动MainActivity,则Activity栈中只会创建一次;但是先启动NextActivity之后再启动MainActivity,则会创建新的MainActivity,因为此时的Activity栈顶是NextActivity

MainActivity ->MainActivity ->MainActivity

MainActivity -> NextActivity -> MainActivity

启动示例图

3.singleTask

当活动的启动模式为singleTask时,启动该Activity会现在栈中检查是否已存在,若存在则直接将该活动之上的Activity全部出栈。
android:launchMode="singleTask"

启动示例图

4.singleInstance

singleInstance模式下会有一个单独的返回栈来管理活动。不管哪个应用程序来访问该活动,都共用同一个栈,这样就可以允许其他程序调用,实现共享该活动。
android:launchMode="singleInstance"

启动示例图

图中启动的过程是:Main -> New -> Next 这个过程很容易看懂
     返回过程是:Next -> Main -> New

明显看出顺序不一样,为什么会出现这种情况呢?

NextActivity和MainActivity处于同一个栈,当我们返回时,NextActivity出栈,此时栈A中还存在MainActivity,并且处于栈顶,所以会看到MainActivity.
当MainActivity执行返回时,栈A会清空,然后我们就看到了位于栈B的NewActivity。
之后NewActivity出栈,栈B也为空时,App退出。

Activity的启动模式简单介绍到这里, 希望对您有所帮助,有不足或者错误的地方请指正。

后面会每星期至少一篇跟新本系列,感兴趣可以关注。

一起学习,一起进步。

demo下载内附APK链接:https://pan.baidu.com/s/1dFakVPf 密码:adti

作者:DuYang_ZXM
链接:http://www.jianshu.com/p/103ab3830bc1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

时间: 2024-08-23 15:03:57

Activity启动模式(launchMode)详解的相关文章

Activity启动模式图文详解

转载自:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0520/2897.html  英文原文:Understand Android Activity’s launchMode: standard, singleTop, singleTask and singleInstance Activity是安卓上最聪明的设计之一,优秀的内存管理让多任务完美运行在最流行的操作系统之上.并不是让Activity在屏幕上启动就完事了,其启动方式也

深入Activity,Activity启动模式LaunchMode完全解析

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53221384 本文出自[DylanAndroid的博客] 深入Activity,Activity启动模式LaunchMode完全解析 在平时的开发中,我们可能会了解到Activity的任务栈还有Activity的启动模式.那么Activity的启动模式都分别是怎么样的呢?如果设置了这些启动模式对任务栈有事么影响 ,还有就是这么启动模式在实际的开发中有什么应用呢?这里用图例和d

全面解析Activity启动模式(LaunchMode)

欢迎Follow我的GitHub, 关注我的CSDN. 在Android应用中, Activity是最核心的组件, 如何生成一个Activity实例, 可以选择不同的启动模式, 即LaunchMode. 启动模式主要包括: standard, singleTop, singleTask, singleInstance. 标准模式在每次启动时, 都会创建实例; 三种单例模式, 会根据情况选择创建还是复用实例. 在Activity启动中, 创建实例的生命周期: onCreate -> onStart

Activity启动模式launchMode

今天要讲得是Activity的四种启动模式launchMode属性,该属性用于配置该Activity的加载模式,该属性支持以下4个属性值. standard:标准模式,也是默认模式. singletop:Task栈顶单例模式. singleTask:Task内单例模式. singlestance:全局单例模式. 在继续写下去之前我想说一下,像launchMode这种基础的Android知识在网上已经有很多大神写得十分详细,为什么我还要写呢?我之所以写,是因为我确确实实是个菜鸟,将课本.网上大神的

Android中Activity启动模式详解,可以控制程序按home键后进来还会调用一个自己不喜欢的界面

其实这是很简单的一个问题.但是这还是要对android中activity的启动模式有相当的理解才行,当点击home键的时候,懂Android的人都知道,他会把当前activity放到后退栈中, 栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算.人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底.向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称为出栈或退栈,它是把栈

Android中Activity启动模式详解

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Android总Activity的启动模式分为四种: Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standard" /> Activity的四种启动模式:

Activity启动模式详解

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Android为了使我们能够打破默认的堆栈的先后出的模式,提供了两个种方式:一种是在AndroidManifest.xml定义Activity时指定它的加载模式,另一种是在用Intent开启一个Activity时,在Intent中加入标志.如果两种方式都用了,则后者的优先级更高.两种方式的差别在于,前者

带你深入理解Activity启动模式(LaunchMode)

我们知道默认情况下,当我们多次启动同一个activity时,系统会创建多个实例并把他们一个个放入任务栈,当我们按back键,这些activity又会一个个退出.在讲activity的launchmode之前,我们有必要了解下"任务栈(Task Stack)"这个概念.在Android中是使用任务(Task)来管理Activity的,任务就是存放在栈里面的Activity的集合,这个栈就是称为任务栈. 一,Activity的LaunchMode 明白任务栈的概念后,我们再来了解Activ

Activity启动模式及Intent的Flag属性对Intent传值的影响

前些时候在支援公司其它部门项目开发的时候,有同事问我:通过Intent在Activity之间进行数据传递,传递的Key和获取的Key都没错,为什么在目标Activity会获取不到传递过来的数据?在Key没错的情况下获取不到数据,那么无疑是Activity的启动模式及在跳转时给Intent设置的Flag属性引起的,于是乎有了今天这篇博客. 原因一:Activity的启动模式 那么Activity以哪种启动模式进行跳转时,会导致目标Activity获取不到传递过来的数据呢?在上一篇Activity启