Activity启动模式

梦想的初衷 提交于 2019-12-02 06:23:39

Activity启动模式

Activity启动模式–AndroidManifest.xml

  1. 默认模式(Strandard)
    每次启动都会创建一个新的Activity。
    avatar

2.栈顶复用(SingleTop)
如果启动的Activity栈顶已经存在,就不用创建。如果没有或者不在栈顶,就创建一个新的。

【不存在】
启动AActivity
avatar

[存在]
启动BActivity
avatar

  1. 栈内复用(SingleTask)

启动AActivity,如果栈内已存在AActivity,会弹出AActivity之上所有的Activity。
avatar

  1. 单独的任务栈中(SingleInstance)

启动的Activity会在单独的任务栈中创建
avatar

动态设置标志位启动

  • FLAG_ACTIVITY_NEW_TASK 跟launchMode中的singleTask一样。
    
  • FLAG_ACTIVITY_SINGLE_TOP 跟launchMode中的singleTop一样。
    
  • FLAG_ACTIVITY_CLEAR_TOP  跟launchMode中的singleTask一样。
    

动态设置的启动模式要比Manifest中设置的优先级要高。

Activity管理过程

众所周知,Activity的管理和生命周期的调用,依赖于AMS。AMS如何管理Activity呢?

Activity在AMS对应的是ActivityRecord.

【ActivityRecord】

用来描述Activity信息,定义了Activity所有属性

名称 类型 说明
service ActivityManagerService 目前AMS的引用
info ActivityInfo 主要记录了Activity在Manifest文件中的配置信息
launchedFromPid int 启动Activity进程的pid
launchedFromUid int 启动Activity进程的uid
taskAffinity String Activity启动后所在的task
task TaskRecord 记录了所在task的信息
app ProcessRecord 记录了Activity启动所在进程的信息
state ActivityState 当前Activity的状态
theme int Activity的主题

【TaskRecord】

管理Activity任务栈,

名称 类型 说明
taskId final int 任务栈的唯一标识
affinity String 任务栈的名称,也就是taskAffinity配置的名称
intent Intent 启动这个任务栈的Intent
mActivities ArrayList 按照在任务栈中历史顺序排序的Activity
mStack ActivityStack 任务栈所在的Activity栈
mService ActivityManagerService

【ActivityStack】

有两种Stack,mHomeStack对应Launcher.mFocuseTask对应的是正在运行的

名称 类型 说明
mService ActivityManagerService 目前AMS的引用
mRecentTasks RecentTasks 记录一个最近使用的Activity列表
mPausingActivity ActivityRecord 目前停止状态的Activity信息
mResumedActivity ActivityRecord 目前resume状态的Activity信息

【ProcessRecord】

ProcessRecord是关于应用进程的描述。

名称 类型 说明
uid int 进程的uid
processName String 进程名称
info ApplicationInfo 记录应用程序信息

== 【ActivityStackSupervisor】 ==

管理ActivivityStack

avatar

AMS Activity启动流程图

avatar

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!