Android开发——Activity启动模式详解

Android开发——Activity启动模式详解1 Activity 的启动模式 1 1Standard 标准模式系统默认的启动模式 即便实例存在 每次启动都会创建一个新的实例 每个实例可以属于不同的任务栈 若 ActivityA 以此模式启动了 ActivityB 那么 B 会进入 A 所在的栈 注意 若是非 Activity 类型的 Context 如 ApplicationC 并没有任务栈 因此以 ApplicationC

1.  Activity的启动模式

本文原创,转载请注明出处:Android开发——Activity启动模式详解_SEU_Calvin的博客-CSDN博客

1.1  Standard标准模式

系统默认的启动模式,即便实例存在,每次启动都会创建一个新的实例,每个实例可以属于不同的任务栈。

ActivityA以此模式启动了Activity B,那么B会进入A所在的栈。注意,若是非Activity类型的Context,如ApplicationContext并没有任务栈,因此以ApplicationContext启动Standard模式的Activity会报错。我们可以在启动时创建一个新的任务栈,指定FLAG_ACTIVITY_NEW_TASK标记位。(此时实际上是以SingleTask模式启动)。标记为下文会讲述。

1.2  SingleTop栈顶复用模式

这种模式下,若新的Activity已位于栈顶,就不会重复创建。不同于Standard模式,此时这个Activity因为没有发生变化,它的onCreateonStart不会被调用

但是它的onNewIntent方法会被调用,通过此方法的参数可以得到请求信息

应用场景:SingleTop用于从外部多次跳入到同一界面,比如新闻客户端的通知推送,如果点击通知都打开一个新闻内容页是不现实的。

1.3  SingleTask栈内复用模式

这种模式下,Activity想要的任务栈如果存在,并且此Activity在此栈中存在实例,多次启动此Activity都不会重新创建实例。同时该模式具有clearTop的效果,已存在的实例上面的Activity全部出栈onNewIntent方法会被调用。若不存在该实例就新建并压入该栈。如果继续启动该Activity,直接onPause、onNewIntent、onResume。

如果想要的任务栈不存在,就新建一个任务栈,并创建Activity实例放入该栈。

应用场景:SingleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面

1.4  SingleInstance单实例模式

此模式启动的Activity只能单独位于一个新建的任务栈中。如果按照相同的模式再次某Activity,不重新创建,并且调用onNewIntent方法。除非这个特殊的任务栈被销毁并且调用onNewIntent方法。

应用场景:适合于需要与程序分离的界面。

1.5  启动模式导致StartActivityForResult失效问题

如果B界面为非Standard模式,A通过startActivityForResult启动BA直接回调onActivityResult()方法并传入RESULT_CANCELED,而不会等待结束后返回,也算是startActivityForResult失效的原因之一,当然startActivityForResult里第二个参数设置为负数也会失效。

 

2.  TaskAffinity属性

TaskAffinity属性标识了一个Activity所需要的任务栈的名字。默认为应用包名。

TaskAffinity属性和SingleTask启动模式结合使用时,待启动的Activity会运行在名字TaskAffinity相同的任务栈中。

TaskAffinity属性和allowTaskReparenting结合使用时,若应用A启动应用B中的Activity CC运行在A的任务栈中),并且此ActivityallowTaskReparenting = true,当应用B被启动后,B的主Activity不会显示,因为Activity C会直接从应用A的任务栈转移到应用B的任务栈中(因为C想要的任务栈被创建了),所以会显示Activity C

 

3.  指定启动模式

3.1  通过AndroidMenifest.xmlActivity指定

android:launchMode = "singleTask"

3.2  通过Intent标识Activity指定

Intent intent = new Intent(); intent.setClass(MainActivity.class,SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);

两种设置方式,第一种优先级较低,并且无法直接给Activity设置FLAG_ACTIVITY_CLEAR_TOP标识。

第二种无法为Activity指定singleInstance模式。

4.  ActivityFlags

大部分情况我们不需要为Activity设置标记位,下面介绍几种比较常用的标记位。

 

4. 1 FLAG_ACTIVITY_NEW_TASK

这种Activity标记位,作用是为Activity指定SingleTask的启动模式。和在清单文件里设置效果相同。

 

4. 2 FLAG_ACTIVITY_SINGLE_TOP

这种Activity标记位,作用是为Activity指定SingleTop的启动模式。和在清单文件里设置效果相同。

 

4. 3 FLAG_ACTIVITY_CLEAR_TOP

SingleTask模式默认具有此标记效果,即被启动Activity的实例已经存在,onNewIntent方法会被调用,已存在的实例上面的Activity全部出栈

如果是Standard启动模式,那么它连同它之上的Activity都要出栈,并创建新的Activity实例入栈

 

4. 4 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

效果和在清单文件里指定android:excludeFromRecents = “true”相同。即不会出现在历史Activity列表中。

Android开发——Activity启动模式详解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227060.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:02
下一篇 2026年3月16日 下午10:02


相关推荐

  • OpenClaw 用户使用手册

    OpenClaw 用户使用手册

    2026年3月13日
    3
  • document.getElementById详解

    document.getElementById详解注意:document.getElementById("")得到的是一个对象,用alert显示得到的是“object”,而不是具体的值,它有value和length等属性,加上.value得到的才是具体的值! 参考资料:1.document.getElementById的用法和DHTML.CHM的下载地址http://blog.sin…

    2022年7月15日
    19
  • 前端面试选择题_vue最新面试题

    前端面试选择题_vue最新面试题面试题集合1、v-model是什么?vue中标签怎么绑定事件?答:v-model这个指令只能用在表单元素上,可以用他进行双向数据绑定。绑定事件:<input@click=doLog()/>2、mvvm框架是什么?说说对双向数据绑定的理解?它和其它框架(jquery)的区别是什么?哪些场景适合?答:mvvm的m模型就是用来定义驱动的数据、v经过数据改变后的html、vm就是连接数据…

    2025年8月26日
    8
  • ride运行报错_chrome OS

    ride运行报错_chrome OShttp://chromedriver.storage.proxy.ustclug.org/index.html下载地址,注意需要与chrome版本对应chromedriver下载解压后,放在chrome安装目录下,查看安装目录chrome://version/最后配置环境变量,chrome安装目录配置在path后重启(我是win10,开始配置在系统变量中重启后无效,后来在用户变量…

    2025年6月3日
    6
  • document.getElementById使用[通俗易懂]

    document.getElementById使用[通俗易懂]HTMLDOMgetElementById()方法HTMLDOMDocument对象参考手册定义和用法getElementById()方法可返回对拥有指定ID的第一个对象的引用。语法document.getElementById(id)说明HTMLDOM定义了多种查找元素的方法,除了getElementById()之外,还有get

    2022年7月15日
    38
  • ImageView(仿QQ图片查看器)

    ImageView(仿QQ图片查看器)程序运行截图:使用方法:1、直接把图像文件拖到图标上显示2、通过命令行方式,示例:ImageView.exe”带全路径的图像文件名称”3、打开ImageView.exe,将图像文件拖到窗口上显示未实现功能:1、右下角比例窗口2、最大化后的窗口底部图片选取条3、打开/关闭窗口动画效果4、优化GDI+支持的图像格式判断逻辑5、不使用图片

    2022年8月10日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号