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四种启动模式

  • 2016年07月21日 09:41
  • 30.55MB
  • 下载

activity的四种启动模式

  • 2014年09月19日 12:02
  • 15KB
  • 下载

Activity中的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。  ...
  • knlnzhao
  • knlnzhao
  • 2012年09月21日 17:46
  • 31364

Activity四种启动模式

  • 2016年01月04日 09:22
  • 184KB
  • 下载

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

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

Activity四种启动模式Demo

  • 2013年07月23日 11:00
  • 73KB
  • 下载

activity四种启动模式demon

  • 2016年09月27日 15:18
  • 5.96MB
  • 下载

Android中Activity四种启动模式和taskAffinity属性详解

在android应用开发中,打造良好的用户体验是非常重要的。而在用户体验中,界面的引导和跳转是值得深入研究的重要内容。在开发中,与界面跳转联系比较紧密的概念是Task(任务)和Back Stack(回...

Activity四种启动模式

  • 2016年08月26日 14:57
  • 391KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity 四种启动模式
举报原因:
原因补充:

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