036android初级篇之Activity的启动模式

task容器任务栈

  1. 当用户点击某个应用程序图标打开一个应用时,那么这个任务就处于前端。如果这个应用程序之前未被打开过,就会创建一个新的任务Task。
  2. Task是一个Activities的收集器,专门收集用户操作交互所打开的Activity。这些Activities都被安排在一个回收栈back stack中,安排的顺序和它们打开的顺序一致。即先打开的安排在最底部,最后一个打开的安排在顶部。

运行模式介绍

你可以通过定义运行模式来定义Activities如何与Task进行交互。定义的两种方式如下:

  1. 使用manifest配置文件
  2. 使用intent的标识

例子:Activity A 启动 Activity B。如果B在manifest中定义了运行模式,并且A在启动B时,也在Intent中指定了B的运行模式,那么A在Intent的定义将覆盖B在manifest中的定义。

注:有些运行模式在manifest中定义有效未必在Intent中也有效,同样,在Intent定义有效的运行模式在manifest中未必生效。

Activity的launchMode属性来指定4中不同的运行模式

Standard:标准默认模式

在这种默认模式下,Activity可以被多次实例化,也可以运行在多个Task中,一个Task可以拥有多个Activity实例。

singleTop

在这种模式下,如果一个Activity实例已经存在于当前Task的最顶部,那么系统将调用onNewIntent()方法路由到这个实例,而不是创建一个新的Activity实例。

一个Activity可以被实例化多次,且可以从属于不同的Task任务,且一个任务中可以存在多个Activity实例(这情况仅仅存在于Activity实例不在Task任务的顶端)。

A-B-C-D:再开启D,back stack中的情形:
在标准模式下,则为 A-B-C-D-D
在singleTop模式,则为A-B-C-D
如果开启B
则在singleTop模式下为 A-B-C-D-B

singTask

这种模式下,系统创建一个新的Task,并在Task的底部实例化Activities。然而,当一个实例存在于一个独立的Task时,系统不是去创建一个新的实例,而是调用onNewIntent()路由到其他任务的实例。在同一时间,只存在一个Activity实例。

singInstance

于singTask相似,唯独一点不同的是,这个实例只能在一个单独的Task中使用。

如何使用Intent配置管理

在启动Activity时,你可以通过传递一个Intent入参给startActivity()方法,来实现与manifest配置类似功能,改变Activity在task中的行为。

  1. FLAG_ACTIVITY_NEW_TASK 和 singleTask 一样
  2. FLAG_ACTIVITY_SINGLE_TOP 和singleTop一样
  3. FLAG_ACTIVITY_CLEAR_TOP 这个模式是没有属性配置支持的。在这种模式下,如果启动一个已经存在于当前Task任务的Activity,那么Task顶部所有的Activity将被销毁,并且为将要启动的Activity新建一个Activity实例,存放在task的back stack的顶部。
  4. FLAG_ACTIVITY_CLEAR_TOP通常与FLAG_ACTIVITY_NEW_TASK一起结合使用, 结合使用可以达到这样的效果:找到在其他Task中存在的Activity,并将它放置到一个可以相应Intent的地方。如果是standard模式,那么它将从stack移除,并新建一个Activity去相应Intent,因为这种模式下,总是新建Activity。

参考链接

  1. Activity的启动模式
  2. Android 开发指南(一) 任务Task及回收栈back stack介绍

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏曾大稳的博客

Android配置EGL环境

Android配置egl环境我们根据GLSurfaceView源码来实现。在GLSurfaceView源码里面,当调用setRenderer的时候会开启一个线程...

25320
来自专栏拭心的安卓进阶之路

Android 进阶2:Activity 的 Task 与启动模式

Android 中的 Task 是什么 我们知道,一个应用中可能有多个 Activity,而这些 Activity 被以栈的形式管理。当我们新打开 Activi...

21950
来自专栏Phoenix的Android之旅

Android初级面试题之一

Activity的四种启动模式想必入门安卓开发一两年的都了解, · standard · singleTop · singleTask · singleInst...

12260
来自专栏yang0range

Activity的启动模式

privatestaticStack mActivityStack;Activity的启动模式,不仅仅是我们面试的时候经常被问到的面试题目,也是我们日常开发当中...

12640
来自专栏分享达人秀

四大组件的纽带——Intent

前面学习Activity时己经多次使用了 Intent,当一个Activity需要启动另一个Activity时, 程序并没有直接告诉系统要启动哪个Act...

23250
来自专栏码农笔录

Android N 7.0 上安装apk问题

14530
来自专栏飞雪无情的博客

Android Intents and Intent Filters(一)

看过前面的几节教程的应该都会留意到一个很重要的东西,那就是Intent。Intent是什么呢?我们都知道Android有四大核心组件 Activity、Serv...

7530
来自专栏增长技术

Android finish All activity

25910
来自专栏刘望舒

Android解析ActivityManagerService(二)ActivityTask和Activity栈管理

前言 关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够。这一篇我们接着来学习与AMS相关的ActivityTask和Activ...

44890
来自专栏上善若水

025android初级篇之Android am命令的实现

am命令一个重要的调试工具,主要功能包括如下: 启动停止Activity Service,启动Broadcast, 查看管理这些信息。

29260

扫码关注云+社区

领取腾讯云代金券