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简介的更多相关文章

  1. 实体框架(Entity Framework)简介

    实体框架(Entity Framework)简介 简称EF,与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...

  2. iOS - 系统经常使用框架(framework)的简介

    系统框架(framework)的简介 ImageIO  - 该框架的接口可用于导入或导出图像数据及图像元数据 CoreTelephony  - 获取IMSI号,SIM卡背面的号码是SIM卡的电子串号, ...

  3. .NET Entity Framework入门简介及简单操作

    Entity Framework是微软借鉴ORM思想开发自己的一个ORM框架. ORM就是将数据库表与实体对象(相当于三层中的Model类)相互映射的一种思想. 最大的优点就是非常方便的跨数据库平台. ...

  4. Spring Framework体系结构简介

    说明:以下转自Spring官方文档,用的版本为4.3.11版本. 一.引用官方文档 2.2.1核心集装箱 所述核心容器由以下部分组成spring-core, spring-beans,spring-c ...

  5. .Net多线程编程—任务Task

    1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...

  6. 转载 .Net多线程编程—任务Task https://www.cnblogs.com/hdwgxz/p/6258014.html

    .Net多线程编程—任务Task   1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 ob ...

  7. .Net 多线程 异步编程 Await、Async和Task

    await和async简介   await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中进行了支持.主要是解决性能瓶颈,并且增强系统的响应能力. msdn关于 ...

  8. Masa Framework源码解读-02缓存模块(分布式缓存进阶之多级缓存)

    序言 ​ 今天这篇文章来看看Masa Framework的缓存设计,上一篇文章中说到的MasaFactory的应用也会在这章节出现.文章中如有错误之处还请指点,咱们话不多说,直入主题. Masa Fr ...

  9. 2、ASP.NET MVC入门到精通——Entity Framework入门

    实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...

  10. C# 泛型简介

    摘要:本文讨论泛型处理的问题空间.它们的实现方式.该编程模型的好处,以及独特的创新(例如,约束.一般方法和委托以及一般继承).此外,本文还讨论 .NET Framework 如何利用泛型. 下载 Ge ...

随机推荐

  1. VSCODE配置tasks.json

    1.新建配置任务tasks.json 选择gcc.exe 可以在其中按需修改 { "version": "2.0.0", "tasks": ...

  2. 结构体中ElementType的使用

    1.问题 在定义结构体时,对于元素值,为什么喜欢使用ElementType而不是直接使用int或者char等等? 2.结论 对于int get_result(int x); 和 int get_res ...

  3. 【TouchGFX】AnalogClock 小部件使用小记

  4. 第二届福州大学至诚学院网络安全大赛G0DCTF Misc WP

    MISC baby_misc 1.题目信息 key文件夹: 还有一张图片 2.解题方法 观察key文件夹里的每个文件信息,发现并无什么有用的,甚至有的为空... 看到文件名称的数字而且还给了图片,可以 ...

  5. C# 线程本地存储 为什么线程间值不一样

    一:背景 1. 讲故事 有朋友在微信里面问我,为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问 ...

  6. 一个轻量快速的C++日志库

    limlog 作一篇文章记录实现,驱动优化迭代. 代码仓库 用法 实现 后端实现 前端实现 日期时间的处理 线程id的获取 日志行的其他项处理 优化 整形字符串格式化优化 测试 benchmark 性 ...

  7. [转帖]使用systemd-analyze 工具来分析各个服务进程的启动性能

    https://www.cnblogs.com/xingmuxin/p/11413784.html systemd-analyze是一个分析启动性能的工具,用于分析启动时服务时间消耗.默认显示启动是内 ...

  8. [转帖]Linux—编写shell脚本操作数据库执行sql

    Linux-编写shell脚本操作数据库执行sql Hughman关注IP属地: 北京 0.0762020.03.20 09:02:13字数 295阅读 1,036 修改数据库数据   在升级应用时, ...

  9. 【转帖】MySQL 8.0 hash join有重大缺陷?

    我并不这么看. 友情提醒:本文建议在PC端阅读. 徐春阳老师发文爆MySQL 8.0 hash join有重大缺陷. 文章核心观点如下:多表(比如3个个表)join时,只会简单的把表数据量小的放在前面 ...

  10. [转帖]通过架设Cockpit服务 使用Web浏览器监测管理多个Linux服务器

    Cockpit是一个易于使用,轻量级和简单但功能强大的工具,通过单个Web浏览器监视和管理多个远程Linux服务器. 如果你管理着一台 Linux 服务器,那么你可能正在寻找一个可靠的管理工具.为了这 ...