Android framework学习笔记 -- 原生分屏原理
来源:互联网 发布:cmm软件内涵 编辑:程序博客网 时间:2024/05/19 02:43
分屏代码在AOSP其实老早就存在了,就一直没有开启而已,在6.0版本可以通过设置系统属性ro.build.type
改为userdebug
,并在开发者选项中开启多窗口模式
,然后在最近任务上就会个按钮可以实现分屏。
通过adb命令也可以实现分屏
$ am task resize 25 0 720 1080 1920
在最近任务的调用链
RecentsActivity#onTaskResize ->RecentsResizeTaskDialog#placeTasks ->SystemServicesProxy#resizeTask -> ActivityManagerNative#resizeTask -> ActivityManagerService#resizeTask -> ActivityStackSupervisor#resizeStackLocked
在am的调用链
Am#runTaskResize-> ActivityManagerNative#resizeTask -> ActivityManagerService#resizeTask -> ActivityStackSupervisor#resizeTaskLocked
ActivityStackSupervisor的实现
foundStackWithBoundsActivityStackSupervisor#moveTaskToStackLocked ->ActivityStackSupervisor#resizeStackLockedActivityStackSupervisor#moveTaskToStackLocked - > WindowManagerService#moveTaskToStackActivityStackSupervisor#resizeStackLocked ->WindowManagerService#resizeStack
WindowManagerService的实现
WindowManagerService#resizeStack ->TaskStack#setBoundsTaskStack#resizeWindows ->updateLayout??
看来让人心情不好的乱七八糟源码分析
//---> frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.javavoid resizeTaskLocked(TaskRecord task, Rect bounds) { task.mResizeable = true; final ActivityStack currentStack = task.stack; if (currentStack.isHomeStack()) { // Can't move task off the home stack. Sorry! return; } // 找到给定区域相同的栈 final int matchingStackId = mWindowManager.getStackIdWithBounds(bounds); if (matchingStackId != -1) { // There is already a stack with the right bounds! if (currentStack != null && currentStack.mStackId == matchingStackId) { // Nothing to do here. Already in the right stack... return; } // Move task to stack with matching bounds. moveTaskToStackLocked(task.taskId, matchingStackId, true); return; } // 栈里只有一个task,直接resize栈 if (currentStack != null && currentStack.numTasks() == 1) { // Just resize the current stack since this is the task in it. resizeStackLocked(currentStack.mStackId, bounds); return; } // 挪动task到新的栈 // Create new stack and move the task to it. final int displayId = (currentStack != null && currentStack.mDisplayId != -1) ? currentStack.mDisplayId : Display.DEFAULT_DISPLAY; ActivityStack newStack = createStackOnDisplay(getNextStackId(), displayId); if (newStack == null) { Slog.e(TAG, "resizeTaskLocked: Can't create stack for task=" + task); return; } moveTaskToStackLocked(task.taskId, newStack.mStackId, true); resizeStackLocked(newStack.mStackId, bounds);}
分屏的核心是task跟bound,需要看一下task是怎么裂变的
阅读全文
0 0
- Android framework学习笔记 -- 原生分屏原理
- Android Framework学习笔记 -- Binder原理
- Android 原生已經支持分屏?
- Android多窗口分屏(原生方法)
- Struts学习笔记:Struts Framework工作原理
- Android Framework--转屏原理
- Android Framework学习笔记 -- 在framework添加system service
- 学习笔记--《Android内核剖析》Framework概述
- android framework层 学习笔记(一)
- android framework层 学习笔记(二)
- Android Framework学习笔记 -- Audio 混音
- Android Framework学习笔记 -- aidl的使用
- 学习笔记--原生JS
- 原生js学习笔记
- android framework broadcast 原理
- Android 7.0分屏原理及生命周期
- Android 7.0 分屏原理分析
- react native 学习笔记----使用Android的原生模块
- 【python学习记录】--1--对图片的基本操作
- 存储器(四) -- 汉明码
- Sass and Compass in Action.pdf 英文原版 免费下载
- HEVC代码学习32:getInterMergeCandidates函数
- upLoadFileTest
- Android framework学习笔记 -- 原生分屏原理
- UVA 11889 Benefit——gcd
- 油田问题 UVA 572
- 类的构造函数、拷贝构造函数、赋值函数、析构函数,分别在何时调用。
- 一张图读懂 Java 多线程
- Java ImageIO图片操作
- 自制嵌入式GUI-基于freeRTOS
- 分类决策树的理解
- 安卓黑马教学(三)