博客
关于我
Activity启动模式
阅读量:800 次
发布时间:2019-03-25

本文共 3748 字,大约阅读时间需要 12 分钟。

我终于地整理了一个详细的技术文档,介绍了Android中Activity的不同启动模式。文档涵盖了standard、singleTop、singleTask和singleInstance四种launchMode,并通过实例代码和图示解释了每种模式的工作原理。

Activity的四种launchMode

Activity在Android中具有不同的启动模式(launchMode),这些模式决定了在跳转过程中是否生成新的Activity实例,是否重用已存在的实例,以及是否共用一个task中的场景。以下是四种常见launchMode的配置和工作原理。

1. standard模式

standard模式是默认的启动模式,无需 explicitly设置android:launchMode属性即可使用。如果想配置该模式,可以将属性设置为standard。这种模式的特点是每次跳转都会生成新的Activity实例。例如,我们可以创建一个简单的FirstActivity来展示standard模式的工作原理:

package com.example; import android.app.Activity;import android.content.Intent;import android.os.Bundle;public class FirstActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.first);        // TextView用于显示当前Activity的序列号        TextView textView = findViewById(R.id.textView);        textView.setText(this.toString());        // Button用于跳转到下一个FirstActivity        Button button = findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(FirstActivity.this, FirstActivity.class);                startActivity(intent);            }        });    }}

连续点击按钮会发现,每次跳转都生成新的FirstActivity实例,并放到任务栈的栈顶。按下后退键可以回到之前的实例,直到完成回到初始状态。

2. singleTop模式

将Activity的launchMode设置为singleTop后,跳转时会优先重用栈顶的Activity实例。如果栈顶没有对应的实例,才会生成新的。以下是使用singleTop模式的示例:

package com.example; import android.app.Activity;import android.content.Intent;import android.os.Bundle;public class SecondActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.second);        //.TextView用于显示当前Activity的序列号        TextView textView = findViewById(R.id.textView);        textView.setText(this.toString());        // Button用于跳转到FirstActivity        Button button = findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(SecondActivity.this, FirstActivity.class);                startActivity(intent);            }        });    }}

在FirstActivity跳转时修改为SecondActivity时,生成新的实例并跳转。但是从SecondActivity跳转回FirstActivity,会复用栈顶的FirstActivity实例,使任务栈简洁。

3. singleTask模式

将Activity的launchMode设置为singleTask后,跳转时会优先使用栈顶的Activity实例,如果有对应的实例,则将其之上的其他实例撤销并展示栈顶对象。以下是使用singleTask模式的示例:

package com.example; import android.app.Activity;import android.content.Intent;import android.os.Bundle;public class ThirdActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.third);        // TextView用于显示当前Activity的序列号        TextView textView = findViewById(R.id.taskIdView);        textView.setText("current task id: " + this.getTaskId());        // Button用于跳转到FirstActivity        Button button = findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(ThirdActivity.this, FirstActivity.class);                startActivity(intent);            }        });    }}

每次从ThirdActivity跳转到FirstActivity时,系统保证只保留一个FirstActivity实例,并将其展示到栈顶。

4. singleInstance模式

singleInstance模式会为Activity创建独立的栈结构,每次启动都会生成唯一的Activity实例。以下是使用单例模式的示例:

这使得每次打开ShareActivity时,系统都会生成一个新的唯一实例。从ShareActivity跳转到其他Activity时,仍然保留唯一性。按下后退键返回时,依然保留当前任务状态,没有丢失。

本文详细介绍了不同launchMode的特点及其工作原理,帮助开发者更好地理解Android中Activity的启动机制。通过实际例子展示了各模式的实际应用效果,便于在实际项目中灵活选择最适合的启动模式。

转载地址:http://kfiyk.baihongyu.com/

你可能感兴趣的文章
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>