资讯专栏INFORMATION COLUMN

Android Activity启动模式总结

tomato / 578人阅读

摘要:是栈顶复用模式。比如现在栈内情况是四个,位于栈底,位于栈顶。如果所需的任务栈为,但是中的情况为,此时不会重新创建,而是把切换到栈顶并调用方法。

简介

Activity 作为 Android 四大组件之一,几乎是被接触得最多的。Activity 中有个启动模式的概念,分别是 standardsingleTopsingleTask 以及 singleinstance,这篇文章总结一下这四种启动模式的特点。

任务栈

当我们打开一个 APP,第一个出现的 Activity 是我们指定的默认 Activity,通过这个 Activity 可以跳转到其它 Activity,按返回键可以依次返回到上一个 Activity。这是因为系统把我们打开的 Activity 放在一个任务栈中。打开第一个 Activity 时,系统会新建一个任务栈,如果继续打开新的 Activity,会创建新 Activity 的实例并且放到任务栈的栈顶,返回时将栈顶的 Activity 出栈,新的栈顶 Activity 将呈现在界面上,过程如下图。

这是默认情况下的任务的入栈出栈,如果指定了不同的启动模式将会有不同的表现。

standard

standard 是标准启动模式,当我们没有指定 Activity 的启动模式时,默认就是这种模式。在 standard 模式下,每次启动一个 Activity 都会创建一个新的实例,它的 onCreateonStart 以及 onResume均会被调用。这个新创建的 Activity将会放在启动它的 Activity 所在的任务栈的栈顶。

比如 Activity A 在栈 S ,它启动了 Activity B(standard 模式),那么 B 将会进入 A 所在的栈 S。

如果在没有任务栈的情况下启动 standard 模式的 Activity,比如在 Service 中,此时新的 Activity 没有任务栈可入,会出现异常:
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

此时应该为这个 Activity 指定 FLAG_ACTIVITY_NEW_TASK,这样就会新建一个任务栈。

singleTop

singleTop 是栈顶复用模式。在这种模式下,如果新启动的 Activity 已经在任务栈的栈顶了,那么就不会重新创建新的实例,而是调用这个 Activity 的 onPauseonNewIntent 以及 onResume 方法。如果新启动的 Activity 不是位于栈顶,那么还是会重新创建。

比如现在栈内情况是 ABCD 四个Activity,A 位于栈底,D 位于栈顶。如果 D 的启动模式为 singleTop,那么不会再次创建 D 的实例,栈内依然是 ABCD。

如果上面的 D 为 standard 启动模式,那么栈内将变为 ABCDD。

singleTask

singleTask 是栈内复用模式。这是最复杂的一种模式,因为它可能涉及到多个栈。当一个具有 singleTask 模式的 Activity 启动后,比如 Activity A,系统会首先寻找是否存在所需的任务栈,如果不存在,就重新创建一个任务栈,然后创建 A 的实例后把 A 放入到栈中。如果存在 A 所需要的任务栈,这时要看 A 是否在栈中有实例存在,如果有,那么系统就会把它调到栈顶并且调用它的 onNewIntent 方法,如果不存在,就创建 A 的实例并把 A 压入栈中。这里所说的 A 所需要的任务栈是什么意思呢?其实 Activity 是可以指定自己想要的任务栈的名字的,通过一个参数:TaskAffinity,默认情况下,所有的 Activity 所需要的任务栈的名字为应用的包名。

如果任务栈 S1 中的情况为 ABC,这个时候 Activity D 以 singleTask 模式请求启动,它需要的任务栈为 S2,由于 S2 和 D 的实例均不存在,所以系统就会先创建任务栈 S2,然后在创建 D 的实例并将其入栈到 S2

如果上面 D 所需的任务栈为 S1,那么因为 S1 已经存在,所以系统直接创建 D 的实例并且入栈到 S1。

如果 D 所需的任务栈为 S1,但是 S1 中的情况为 ADBC,此时 D 不会重新创建,而是把 D 切换到栈顶并调用 onNewIntent 方法。那 B 和 C 怎么办? 它们会全部出栈,相当于 clearTop 效果。

singleInstance

singleInstance 是单实例模式。这种模式是 singleTask 的加强版,它除了具有 singleTask 的所有特性外,还加强了一点,那就是此种模式的 Activity 只能多带带位于一个任务栈中。

比如 Activity A 是 singleInstance 模式,当 A 启动后,系统会创建一个新的任务栈,然后 A 独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的 Activity,除非这个栈被销毁了。

总结

Activity 的四种启动模式就是这样,除了 singleTask 稍微有点复杂,其它都很好理解。有的时候会出现多个任务栈的情况,比如现在有两个任务栈(如下图),前台的任务栈情况为 Activity1 和 Activity2, 而后台任务栈的情况为 ActivityX 和 ActivityY,假设 XY 的启动模式均为 singleTAsk。现在启动Y, 那么整个后台任务栈都被切换到前台,这时候的后退列表变为 12XY。当按返回键的时候,Activity 会依次出栈。

参考

Android 开发艺术探索

http://developer.android.com/...

如果我的文章对您有帮助,不妨点个赞鼓励一下(^_^)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12729.html

相关文章

  • Activity 总结

    摘要:俩个和,那么启动的过程中,的与的哪个先执行新启动之前,栈顶的需要先后,新的才能启动的。如果新的实例已经存在但不位于栈顶,那么新的仍然会被重新创建。如果启动的位于当前任务栈中,启动该时,会把该切换到栈顶后,还将导致它上边的全部出栈。 Activity 是 Android 四大组件之一,每个 Activity 都会获得一个用于绘制其用户界面的窗口,用户可与其进行交互。以下来总结 Activ...

    KavenFan 评论0 收藏0
  • Android面试知识整理

    摘要:全面而详尽的面试题集面试系列总结全方面覆盖知识结构什么是如何避免指的是应用程序在一段时间内无响应,系统会向用户弹出一个应用无响应的对话框,用户可以选择关闭应用或者继续等待应用响应,这往往是由于程序的性能所引发的。 全面而详尽的Android面试题集Android面试系列2018总结(全方面覆盖Android知识结构) 1. 什么是ANR?如何避免? ANR(Application N...

    U2FsdGVkX1x 评论0 收藏0
  • 01.Android之基础组件问题

    摘要:此时再次旋转屏幕时,该不会被系统杀死和重建,只会调用。因此可通过和来判断是否被重建,并取出数据进行恢复。但需要注意的是,在取出数据时一定要先判断是否为空。只有在进程不被掉,正常情况下才会执行方法。 目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0.2 后台的Activity被系统回收怎么办?说一下onSaveInsta...

    iamyoung001 评论0 收藏0
  • Android四大组件之Activity全解析

    摘要:该始终是其唯一仅有的成员,由此启动的任何,如果没有指定返回栈名称,则新启动的放入默认的返回栈如果指定了返回栈名称,则将新启动的放入指定的返回栈中。 1. 简介        本篇不针对于新手,而是对于Activity中一些常识或者问题进行总结。Activity是Android四大组件之一,为用户提供与系统交互的界面,每一个应用都有一个或者多个Acticity,这样会有各种各样的细节问题...

    leone 评论0 收藏0
  • Android四大组件之Activity全解析

    摘要:该始终是其唯一仅有的成员,由此启动的任何,如果没有指定返回栈名称,则新启动的放入默认的返回栈如果指定了返回栈名称,则将新启动的放入指定的返回栈中。 1. 简介        本篇不针对于新手,而是对于Activity中一些常识或者问题进行总结。Activity是Android四大组件之一,为用户提供与系统交互的界面,每一个应用都有一个或者多个Acticity,这样会有各种各样的细节问题...

    haobowd 评论0 收藏0

发表评论

0条评论

tomato

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<