Activity 四种启动模式

原创 2016年08月29日 19:29:56

Task(任务) back Stack(回退栈)

  • 栈:先进后出
  • 任务:用于保存当前Activity组件的实例(动作)
  • 回退栈:Activity在内存中的数据结构都是回退栈(管道)
  • 备注:1.位于回退栈顶的窗口处于焦点状态(可见的)2.窗口的显示和退出其实就是入栈和出栈的过程

    Activity启动模式

    -1在清单文件中`标签内部,设置属性 Android:launceMode=“”

    -支持四种属性:
    standard 标准模式,默认的启动方式
    singTop 栈顶单例模式
    singleTask 栈中单例模式
    singleInstance 全局单例模式

作用:内存的优化,用户的体验

  1. standard 标准模式,默认的启动模式(拿来主义)同一个Activity每次都会创建一个新的实例
    这里写图片描述
  2. singleTop(拒绝堆叠)同一个Activity可以实例化多次,但是栈顶只能出现一个,当栈顶不存在要启动的Activity实例而是,系统会创建一个新的Activity实例,并且放到栈的顶端,当栈顶存在要启动的Activity实例时,系统会调用onNewIntent()方法,把Intent对象传递给已经存在的Activity实例,重用栈顶的Activity
    这里写图片描述
  3. singleTask 浏览器 (独立门户) 同一个Activity实例在栈中只能有一个,当栈中不存在要启动的Activity实例时,系统会创建一个新的Activity实例,并且放入栈的顶端,当栈中已经存在要启动的Activity实例时,系统会调用已存在的Activity的onNewIntent(),把Intent对象传递给已经存在的Activity实例(并不会创建新的实例),并且不允许栈的上方出现其他的Activity实例,它上方的Activity实例将会被移出栈中,销毁
    这里写图片描述
  4. singleInstance(孤独寂寞)当使用这种模式启动Activity时,系统会分配一个单独的任务,并将Activity的实例放入栈的底端,它不允许其他的Activity实例和他共享一个栈
    这里写图片描述

第二种方式:在代码中设置,Activity类中设置,通过Intent对象设置

  • intent.setFlages(…..);
  • intent.FLAG_ACTIVITY_SINGLE_TOP 等同于属于属性中的singleTop
  • intent.FLAG_ACTIVITY_CLEAR_TOP 同singleTask相似,当栈中不存在时创建;如果存在那么会把它以及之上的所有实例移除,并且销毁,创建一个新的实例放入栈的顶端
  • Intent.FLAG_ACTIVITY_NEW_TASK必须在清单文件的<activity/> 标签中增加属性android:taskAffinity="com.other" android:alwaysRetainTaskState="true" 只是增加了这两个属性,系统才会为当前的实例创建新的任务,并且放到栈的底部,否则等同于没有设置。

测试代码

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tv);

        tv.setText(getTaskId()+"-----"+this.hashCode());
    }


    public void clickButton(View v)
    {
        Intent intent = new Intent(this, BActivity.class);

        //通过代码方式设置启动方式
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

        startActivity(intent);
    }

}
public class BActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);


        tv = (TextView) findViewById(R.id.tv);

        tv.setText(getTaskId()+"-----"+this.hashCode());
    }

    public void clickButton(View v)
    {
        Intent intent = new Intent(this, CActivity.class);

        //通过代码方式设置启动方式
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


        startActivity(intent);
    }

}
public class CActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_c);

        tv = (TextView) findViewById(R.id.tv);

        tv.setText(getTaskId()+"-----"+this.hashCode());
    }

    public void clickButton(View v)
    {
        Intent intent  = null;

        switch (v.getId()) {
        case R.id.but01:

            intent = new Intent(this,BActivity.class);


            //通过代码方式设置启动方式
            intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

            break;

        case R.id.but02:

            intent  = new Intent(this,CActivity.class);

            //通过代码方式设置启动方式
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            break;

        }

        startActivity(intent);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        // TODO Auto-generated method stub
        super.onNewIntent(intent);

        tv.setText("onNewIntent" + getTaskId()+"-----"+this.hashCode());
    }

Activity的四种启动模式及使用场景

standard、singleTop、singleTask、singleInstance 默认Activity为standard标准模式,多次启动同一个Activity时,系统会创建多个实例,在这种模...
  • Liu_yunzhao
  • Liu_yunzhao
  • 2017年10月16日 22:47
  • 787

Activity四种启动模式说明

1,standard标准模式: 每次启动一个Activity都会重新创建一个实例,即调用Activity创建时的生命周期方法onCreate,onStart,onResume;被启动的Activity...
  • u011959433
  • u011959433
  • 2016年03月21日 15:54
  • 2124

[Android开发]Activity的四种启动模式及其应用场景

启动模式(launchMode)在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用...
  • CodeEmperor
  • CodeEmperor
  • 2016年01月08日 11:39
  • 15145

彻底弄懂Activity四大启动模式

最近有几位朋友给我留言,让我谈一下对Activity启动模式的理解。我觉得对某个知识点的理解必须要动手操作才能印象深刻,所以今天写一篇博文,结合案例理解Activity启动模式。由于之前看过“区长”的...
  • mynameishuangshuai
  • mynameishuangshuai
  • 2016年05月24日 16:04
  • 58731

Activity四种启动模式详解

最近在学习《Android开发艺术探索》,所以对所学习到的知识做个总结,就算是做笔记吧。 Activity的启动模式目前有四种,分别是standard、singleTop、singleTask和si...
  • Mr_wzc
  • Mr_wzc
  • 2016年06月23日 20:16
  • 2670

Activity四种启动模式的利用场景

一.singleTask: 场景1: 需求说明:如果自己的客户端处于运行状态,按下Home键后台挂起。此时如果使用微信调起自己的客户端某 个页面,不做任何处理的情况下,按下回退或者当前Activi...
  • berber78
  • berber78
  • 2014年02月21日 16:42
  • 10454

浅谈Activity的四种启动模式

本文主要聊聊Activity的四种启动模式,请看文章!
  • itluochen
  • itluochen
  • 2016年09月20日 19:31
  • 1520

Android学习之Activity的四种启动模式与特点

Acitivty的四种启动模式与特点activity有四种启动模式,分别为: standard singleTop singleTask singleInstance 可以和activity的fla...
  • u011726984
  • u011726984
  • 2015年10月27日 23:36
  • 2800

Activity的四种启动模式-图文并茂eclipse设置详解

在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。 ...
  • Guofengpu
  • Guofengpu
  • 2016年07月28日 19:57
  • 496

activity的四种启动模式区别_launchmode图文详解

Activity的launchMode详细分析 应用中的每一个Activity都是进行不同的事物处理。以邮件客户端为例,InboxActivity目的就是为了展示收件箱,这个Activity...
  • androidstar_cn
  • androidstar_cn
  • 2016年10月03日 23:55
  • 826
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity 四种启动模式
举报原因:
原因补充:

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