关闭

Activity 四种启动模式

标签: android
163人阅读 评论(0) 收藏 举报
分类:

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());
    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:30115次
    • 积分:1622
    • 等级:
    • 排名:千里之外
    • 原创:133篇
    • 转载:25篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论