【framework】Task简介
1 前言
Task 即任务,一个 Task 对应一个 Activity,其父容器为 TaskStack,子容器为 AppWindowToken。
关于其父类及祖父类的介绍,见 → WindowContainer简介、ConfigurationContainer简介。

2 源码
源码地址→/frameworks/base/services/core/java/com/android/server/wm/Task.java
(1)类定义
//AppWindowToken 为子节点类型
class Task extends WindowContainer<AppWindowToken> implements ConfigurationContainerListener
(2)主要属性
//父节点
TaskStack mStack
final int mTaskId
final int mUserId
final Rect mPreparedFrozenBounds = new Rect()
final Configuration mPreparedFrozenMergedConfig = new Configuration()
private final Rect mOverrideDisplayedBounds = new Rect()
private int mLastRotationDisplayId = Display.INVALID_DISPLAY
private int mRotation
private int mResizeMode
private int mDragResizeMode
private TaskDescription mTaskDescription
private Dimmer mDimmer = new Dimmer(this)
TaskRecord mTaskRecord
(3)构造方法
Task(int taskId, TaskStack stack, int userId, WindowManagerService service, int resizeMode, boolean supportsPictureInPicture, TaskDescription taskDescription, TaskRecord taskRecord) {
super(service);
mTaskId = taskId;
mStack = stack;
mUserId = userId;
mResizeMode = resizeMode;
mSupportsPictureInPicture = supportsPictureInPicture;
mTaskRecord = taskRecord;
if (mTaskRecord != null) {
mTaskRecord.registerConfigurationChangeListener(this);
}
setBounds(getRequestedOverrideBounds());
mTaskDescription = taskDescription;
setOrientation(SCREEN_ORIENTATION_UNSET);
}
(4)节点相关
//position = getAdjustedAddPosition(position)
//super.addChild(wtoken, position)
void addChild(AppWindowToken wtoken, int position)
//position = getAdjustedAddPosition(position)
//super.positionChildAt(position, child, includingParents)
void positionChildAt(int position, AppWindowToken child, boolean includingParents)
//super.removeChild(token)
void removeChild(AppWindowToken token)
//positionChildAt(aToken, POSITION_TOP)
void positionChildAtTop(AppWindowToken aToken)
//positionChildAt(position, aToken, false)
void positionChildAt(AppWindowToken aToken, int position)
//removeImmediately()
void removeIfPossible()
//super.removeImmediately()
void removeImmediately()
(5)Task 相关
//getParent().removeChild(this)
//stack.addTask(this, position, showForAllUsers(), moveParents)
void reparent(TaskStack stack, int position, boolean moveParents)
//isResizeable()
boolean cropWindowsToStackBounds()
//callback.accept(this)
void forAllTasks(Consumer<Task> callback)
//setDragResizing(resizing, DRAG_RESIZE_MODE_DOCKED_DIVIDER)
public void setTaskDockedResizing(boolean resizing)
//mChildren.get(i).cancelAnimation()
void cancelTaskWindowTransition()
//mTaskDescription = taskDescription
void setTaskDescription(TaskDescription taskDescription)
//return mTaskDescription
TaskDescription getTaskDescription()
(6)Display 相关
//mStack.getDisplayContent()
DisplayContent getDisplayContent()
//mWmService.mAtmService.getTaskChangeNotificationController().notifyTaskDisplayChanged(mTaskId, displayId)
void onDisplayChanged(DisplayContent dc)
//return mOverrideDisplayedBounds
public Rect getDisplayedBounds()
//mOverrideDisplayedBounds.set(overrideDisplayedBounds)
void setOverrideDisplayedBounds(Rect overrideDisplayedBounds)
//mOverrideDisplayedBounds
Rect getOverrideDisplayedBounds()
(7)Surface 相关
//super.prepareSurfaces()
void prepareSurfaces()
//return super.makeSurface().setMetadata(METADATA_TASK_ID, mTaskId)
SurfaceControl.Builder makeSurface()
(8)AppToken 相关
//final AppWindowToken token = mChildren.get(i)
//final WindowState win = token.findMainWindow()
//return (win != null && win.mAttrs.isFullscreen()) ? token : null
AppWindowToken getTopFullscreenAppToken()
//final AppWindowToken token = mChildren.get(i)
//return (!token.mIsExiting && !token.isClientHidden() && !token.hiddenRequested) ? token :null
AppWindowToken getTopVisibleAppToken()
(9)Bunds 相关
//return setBounds(bounds)
public int setBounds(Rect bounds, boolean forceResize)
//super.setBounds(bounds)
public int setBounds(Rect bounds)
//mPreparedFrozenBounds.set(getBounds())
//mPreparedFrozenMergedConfig.setTo(getConfiguration())
void prepareFreezingBounds()
void alignToAdjustedBounds(Rect adjustedBounds, Rect tempInsetBounds, boolean alignBottom)
//getDisplayContent().layoutAndAssignWindowLayersIfNeeded()
void resize(boolean relayout, boolean forced)
//mResizeMode = resizeMode
void setResizeable(int resizeMode)
//return ActivityInfo.isResizeableMode(mResizeMode) || mSupportsPictureInPicture || mWmService.mForceResizableTasks
boolean isResizeable()
//return matchParentBounds() || !getWindowConfiguration().canResizeTask()
boolean fillsParent()
(10)动画相关
//return getAppAnimationLayer(ANIMATION_LAYER_HOME)
public SurfaceControl getAnimationLeashParent()
//final RecentsAnimationController recentsAnim = mWmService.getRecentsAnimationController()
//return recentsAnim.isAnimatingTask(this)
boolean isTaskAnimating()
(11)Drag 相关
void setDragResizing(boolean dragResizing, int dragResizeMode)
resetDragResizingChangeReported()
//return mDragResizing
boolean isDragResizing()
//return mDragResizeMode
int getDragResizeMode()
(12)Dim 相关
//return mDimmer
Dimmer getDimmer()
public void getDimBounds(Rect out)
//mDimmer.dontAnimateExit()
void dontAnimateDimExit()
(13)flag 相关
//mCanAffectSystemUiFlags = canAffectSystemUiFlags
void setCanAffectSystemUiFlags(boolean canAffectSystemUiFlags)
//return mCanAffectSystemUiFlags
boolean canAffectSystemUiFlags()
(14)其他方法
//return hasWindowsAlive() && mStack.isSelfOrChildAnimating()
boolean shouldDeferRemoval()
//adjustBoundsForDisplayChangeIfNeeded(getDisplayContent())
void positionAt(int position)
//mChildren.get(i).sendingToBottom = toBottom
void setSendingToBottom(boolean toBottom)
//mTaskRecord.onConfigurationChanged(mTaskRecord.getParent().getConfiguration())
public boolean onDescendantOrientationChanged(IBinder freezeDisplayToken, ConfigurationContainer requestingContainer)
//return (mChildren.size() != 0) && mChildren.get(tokensCount - 1).mShowForAllUsers
boolean showForAllUsers()
//return getWindowConfiguration().tasksAreFloating() && !mStack.isAnimatingBoundsToFullscreen() && !mPreserveNonFloatingState
boolean isFloating()
//getTopVisibleAppToken().findMainWindow()
WindowState getTopVisibleAppMainWindow()
//mChildren.get(i).forceWindowsScaleableInTransaction(force)
void forceWindowsScaleable(boolean force)
//mTaskRecord.onSnapshotChanged(snapshot)
void onSnapshotChanged(ActivityManager.TaskSnapshot snapshot)
//mPreserveNonFloatingState = false
void clearPreserveNonFloatingState()
声明:本文转自【framework】Task简介
【framework】Task简介的更多相关文章
- 实体框架(Entity Framework)简介
实体框架(Entity Framework)简介 简称EF,与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...
- iOS - 系统经常使用框架(framework)的简介
系统框架(framework)的简介 ImageIO - 该框架的接口可用于导入或导出图像数据及图像元数据 CoreTelephony - 获取IMSI号,SIM卡背面的号码是SIM卡的电子串号, ...
- .NET Entity Framework入门简介及简单操作
Entity Framework是微软借鉴ORM思想开发自己的一个ORM框架. ORM就是将数据库表与实体对象(相当于三层中的Model类)相互映射的一种思想. 最大的优点就是非常方便的跨数据库平台. ...
- Spring Framework体系结构简介
说明:以下转自Spring官方文档,用的版本为4.3.11版本. 一.引用官方文档 2.2.1核心集装箱 所述核心容器由以下部分组成spring-core, spring-beans,spring-c ...
- .Net多线程编程—任务Task
1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...
- 转载 .Net多线程编程—任务Task https://www.cnblogs.com/hdwgxz/p/6258014.html
.Net多线程编程—任务Task 1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 ob ...
- .Net 多线程 异步编程 Await、Async和Task
await和async简介 await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持.主要是解决性能瓶颈,并且增强系统的响应能力. msdn关于 ...
- Masa Framework源码解读-02缓存模块(分布式缓存进阶之多级缓存)
序言 今天这篇文章来看看Masa Framework的缓存设计,上一篇文章中说到的MasaFactory的应用也会在这章节出现.文章中如有错误之处还请指点,咱们话不多说,直入主题. Masa Fr ...
- 2、ASP.NET MVC入门到精通——Entity Framework入门
实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...
- C# 泛型简介
摘要:本文讨论泛型处理的问题空间.它们的实现方式.该编程模型的好处,以及独特的创新(例如,约束.一般方法和委托以及一般继承).此外,本文还讨论 .NET Framework 如何利用泛型. 下载 Ge ...
随机推荐
- [转帖]麒麟v10上部署TiDBv5.1.2生产环境的最佳实践
https://tidb.net/book/tidb-monthly/2022/2022-07/usercase/tidb-v5-1-2 前言 笔者最近在一个银行项目中做 PoC 测试,由于客户选择 ...
- [转帖]TiDB + TiFlash : 朝着真 HTAP 平台演进
https://zhuanlan.zhihu.com/p/80495479 作者介绍:韦万,PingCAP 数据库研发工程师,主要领域是数据库的存储引擎研发,以及系统性能优化. 一.为什么我们需要 H ...
- [转帖]SSL数字证书分类DV/OV/EV
SSL证书的分类主要是通过下面两个维度进行分类: 1.根据验证模式分类 根据CA机构对申请者的身份审核范围分为:DV证书.OV证书.EV证书. 1.1.DV证书(域名证书) DV(Domain Val ...
- Python学习之十八_获取神通数据库所有的表数据量
Python学习之十八_获取神通数据库所有的表数据量 背景 今天想获取一下所有数据库的表信息.但是发现神通数据库的系统表里面的表信息不正确 无法获取实际意义的表信息. 联系了下神通数据库的原厂高手. ...
- [转帖]python字符串如何删除后几位
https://www.python51.com/jc/15070.html 1.首先在jupyter notebook中新建一个空白的python文件: 2.然后定义一个字符串,用字符串截取的方式打 ...
- [转帖]腾讯北极星 Polaris 试用
https://www.cnblogs.com/QIAOXINGXING001/p/15482012.html 了解.试用 昨天稀土开发者大会2021提到了腾讯开源的北极星, 试用一下; 官网: 北极 ...
- [转帖]kubelet 原理解析四:probeManager
https://segmentfault.com/a/1190000022163835 概述 在Kubernetes 中,系统和应用程序的健康检查任务是由 kubelet 来完成的,本文主要讨论kub ...
- 记windows自定义bat脚本自启动
自定义 Windows 启动脚本简化版 在本指南中,我们将使用一个简化的批处理文件(.bat)来演示如何创建自定义的 Windows 启动脚本.以下是一个基本的模板,您只需根据需要在 :begin 部 ...
- 每日一库:使用Viper处理Go应用程序的配置
在开发Go应用程序时,处理配置是一个常见的需求.配置可能来自于配置文件.环境变量.命令行参数等等.Viper是一个强大的库,可以帮助我们处理这些配置. 什么是Viper? Viper是一个应用程序配置 ...
- x509: cannot validate certificate for xxx because it doesn't contain any IP SANs
项目中有时候需要访问https网站,但如果该网站使用的是自建证书,那client端验证server端证书时,有时候会报错: x509: cannot validate certificate for ...