android T分屏流程

这篇具有很好参考价值的文章主要介绍了android T分屏流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概览

android T分屏流程
android T分屏流程
分屏前的order

  Task display areas in top down Z order:
    TaskDisplayArea DefaultTaskDisplayArea
      mPreferredTopFocusableRootTask=Task{919dc1b #1 type=home ?? U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}
      mLastFocusedRootTask=Task{919dc1b #1 type=home ?? U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}
      Application tokens in top down Z order:
      * Task{919dc1b #1 type=home ?? U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}
        bounds=[0,0][1080,2520]
        * Task{95cd9f8 #2 type=home I=com.miui.home/.launcher.Launcher U=0 rootTaskId=1 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}
          bounds=[0,0][1080,2520]
          * ActivityRecord{23a7bec u0 com.miui.home/.launcher.Launcher} t2}
      * Task{e49cf5a #27 type=standard A=10219:com.miui.weather2 U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=1}
        bounds=[0,0][1080,2520]
        * ActivityRecord{4788499 u0 com.miui.weather2/.ActivityWeatherMain} t27}
      * Task{ec94c1a #38 type=undefined ?? U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=0}
        bounds=[0,0][1080,2520]
      * Task{a07962f #25 type=standard A=10070:android.task.mms U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=1}
        bounds=[0,0][1080,2520]
        * ActivityRecord{43f400e u0 com.android.mms/.ui.MmsTabActivity} t25}
    // 分屏的Task位于TaskDisplayArea的最底部
      * Task{bcbb9ca #39 type=standard ?? U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=2}
        bounds=[0,0][1080,2520]
        * Task{495d73b #41 type=standard ?? U=0 rootTaskId=39 visible=false visibleRequested=false mode=multi-window translucent=true sz=0}
          bounds=[0,1317][1080,2520]
        * Task{65e6135 #40 type=undefined ?? U=0 rootTaskId=39 visible=false visibleRequested=false mode=multi-window translucent=true sz=0}
          bounds=[0,0][1080,1289]

分屏时的order

  Task display areas in top down Z order:
    TaskDisplayArea DefaultTaskDisplayArea
      mPreferredTopFocusableRootTask=Task{f555c62 #4 type=standard ?? U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=2}
      mLastFocusedRootTask=Task{f555c62 #4 type=standard ?? U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=2}
      Application tokens in top down Z order:
      // reorder分屏相关Task到TaskDisplayArea顶部
      * Task{f555c62 #4 type=standard ?? U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=2}
        bounds=[0,0][1080,2520]
        * Task{f4a61f3 #6 type=undefined ?? U=0 rootTaskId=4 visible=true visibleRequested=true mode=multi-window translucent=false sz=1}
          bounds=[0,1295][1080,2520]
          * Task{9b3720c #80 type=standard A=10213:com.miui.notes U=0 rootTaskId=4 visible=true visibleRequested=true mode=multi-window translucent=false sz=1}
            bounds=[0,1295][1080,2520]
            * ActivityRecord{2ab7e0 u0 com.miui.notes/.ui.NotesListActivity} t80}
        * Task{3c50f2d #5 type=standard ?? U=0 rootTaskId=4 visible=true visibleRequested=true mode=multi-window translucent=false sz=1}
          bounds=[0,0][1080,1267]
          * Task{27d1129 #78 type=undefined A=10003:com.miui.gallery.home U=0 rootTaskId=4 visible=true visibleRequested=true mode=multi-window translucent=false sz=2}
            bounds=[0,0][1080,1267]
            * ActivityRecord{c63706 u0 com.miui.gallery/.activity.GallerySettingsActivity} t78}
            * ActivityRecord{1435ba u0 com.miui.gallery/.activity.HomePageActivity} t78}
      * Task{a48f388 #1 type=home ?? U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=1}
        bounds=[0,0][1080,2520]
        * Task{e676dd2 #2 type=home I=com.miui.home/.launcher.Launcher U=0 rootTaskId=1 visible=false visibleRequested=false mode=fullscreen translucent=true sz=1}
          bounds=[0,0][1080,2520]
          * ActivityRecord{3faca81 u0 com.miui.home/.launcher.Launcher} t2}
      * Task{ad9de1e #3 type=undefined ?? U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=0}
        bounds=[0,0][1080,2520]

进入分屏

systemui 进程

android T上的分屏是在分屏下屏确定后桌面进程调用位于systemui进程的wm shell下的com.android.wm.shell.splitscreen.SplitScreenController.ISplitScreenImpl的startTasksWithLegacyTransition方法去开启分屏流程。

    /**
     * The interface for calls from outside the host process.
     */
    @BinderThread
    private static class ISplitScreenImpl extends ISplitScreen.Stub {
        ......
        @Override
        public void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions,
                int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition,
                float splitRatio, RemoteAnimationAdapter adapter) {
            // binder 线程post 到主线程的executor去执行
            executeRemoteCallWithTaskPermission(mController, "startTasks",
                    (controller) -> controller.mStageCoordinator.startTasksWithLegacyTransition(
                            mainTaskId, mainOptions, sideTaskId, sideOptions, sidePosition,
                            splitRatio, adapter));
        }

android T分屏流程

system server进程

进入分屏时WindowContainerTransaction的HierarchyOp列表包含三个元素:reorder、startTask、startTask
android T分屏流程

    private void applyTransaction(@NonNull WindowContainerTransaction t, int syncId,
            @Nullable Transition transition, @NonNull CallerInfo caller,
            @Nullable Transition finishTransition) {
            ......
            // Hierarchy changes
            final List<WindowContainerTransaction.HierarchyOp> hops = t.getHierarchyOps();
            final int hopSize = hops.size();
            if (hopSize > 0) {
                final boolean isInLockTaskMode = mService.isInLockTaskMode();
                for (int i = 0; i < hopSize; ++i) {
                    effects |= applyHierarchyOp(hops.get(i), effects, syncId, transition,
                            isInLockTaskMode, caller, t.getErrorCallbackToken(),
                            t.getTaskFragmentOrganizer(), finishTransition);
                }
            }
           ......
    }

android T分屏流程

退出分屏

systemui进程

android T分屏流程

system server进程

退出分屏时WindowContainerTransaction的HierarchyOp列表也包含三个元素:childrenTasksReparent、childrenTasksReparent、reorder(分屏最外层的fullcscreen task)
android T分屏流程

{ChildrenTasksReparent: from=RemoteToken{6206d89 Task{495d73b #41 type=standard ?? U=0 rootTaskId=39 visible=true visibleRequested=true mode=multi-window translucent=false sz=1}} to=null mToTop=false mReparentTopOnly=false mWindowingMode=[1, 0, 6] mActivityType=[1]}
{ChildrenTasksReparent: from=RemoteToken{1d0a090 Task{65e6135 #40 type=undefined ?? U=0 rootTaskId=39 visible=true visibleRequested=true mode=multi-window translucent=false sz=1}} to=null mToTop=true mReparentTopOnly=false mWindowingMode=[1, 0, 6] mActivityType=[1]}
{reorder: RemoteToken{aae4b1a Task{bcbb9ca #39 type=standard ?? U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=2}} to bottom}

android T分屏流程文章来源地址https://www.toymoban.com/news/detail-511447.html

    private int reparentChildrenTasksHierarchyOp(WindowContainerTransaction.HierarchyOp hop,
            @Nullable Transition transition, int syncId) {
        // 一般为分屏的上下屏Task,mode为multi-window
        WindowContainer<?> currentParent = hop.getContainer() != null
                ? WindowContainer.fromBinder(hop.getContainer()) : null;
        // 这里一般为null
        WindowContainer newParent = hop.getNewParent() != null
                ? WindowContainer.fromBinder(hop.getNewParent()) : null;
        if (currentParent == null && newParent == null) {
            throw new IllegalArgumentException("reparentChildrenTasksHierarchyOp: " + hop);
        } else if (currentParent == null) {
            currentParent = newParent.asTask().getDisplayContent().getDefaultTaskDisplayArea();
        } else if (newParent == null) {
            // newParent赋值为TaskDisplayArea
            newParent = currentParent.asTask().getDisplayContent().getDefaultTaskDisplayArea();
        }

       ......

        // We want to collect the tasks first before re-parenting to avoid array shifting on us.
        final ArrayList<Task> tasksToReparent = new ArrayList<>();

        currentParent.forAllTasks(task -> {
            Slog.i(TAG, " Processing task=" + task);
            final boolean reparent;
            if (task.mCreatedByOrganizer || task.getParent() != finalCurrentParent) {
                // We only care about non-organized task that are direct children of the thing we
                // are reparenting from.
                return false;
            }
            if (newParentInMultiWindow && !task.supportsMultiWindowInDisplayArea(newParentTda)) {
                Slog.e(TAG, "reparentChildrenTasksHierarchyOp non-resizeable task to multi window,"
                        + " task=" + task);
                return false;
            }
            if (!ArrayUtils.contains(hop.getActivityTypes(), task.getActivityType())
                    || !ArrayUtils.contains(hop.getWindowingModes(), task.getWindowingMode())) {
                return false;
            }

            if (hop.getToTop()) {
                tasksToReparent.add(0, task);
            } else {
                tasksToReparent.add(task);
            }
            return hop.getReparentTopOnly() && tasksToReparent.size() == 1;
        });

        final int count = tasksToReparent.size();
        for (int i = 0; i < count; ++i) {
            final Task task = tasksToReparent.get(i);
            if (syncId >= 0) {
                addToSyncSet(syncId, task);
            }
            if (transition != null) transition.collect(task);
        	// 执行reparent操作
            if (newParent instanceof TaskDisplayArea) {
                // For now, reparenting to display area is different from other reparents...
                task.reparent((TaskDisplayArea) newParent, hop.getToTop());
            } else {
                task.reparent((Task) newParent,
                        hop.getToTop() ? POSITION_TOP : POSITION_BOTTOM,
                        false /*moveParents*/, "processChildrenTaskReparentHierarchyOp");
            }
        }

        if (transition != null) transition.collect(newParent);

        return TRANSACT_EFFECTS_LIFECYCLE;
    }

到了这里,关于android T分屏流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring启动流程 (1) 流程概览

    本文将通过阅读AnnotationConfigApplicationContext源码,分析Spring启动流程。 核心的启动逻辑都在refresh方法中。 定义了多个register方法,用于向Spring容器注册BeanDefinition。 在创建AnnotatedBeanDefinitionReader时,会向容器注册几个注解驱动处理器: org.springframework.context.annotation.internalConf

    2024年02月11日
    浏览(40)
  • Android 11.0 SystemUI禁用长按recent键的分屏功能

    在11.0的系统rom产品定制化中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 在Android应用程序中,导航栏(NavigationBarView)是一个重要的UI组件,默认位于屏

    2024年02月20日
    浏览(93)
  • android display 杂谈(三)WMS

    用来记录学习wms,后续会一点一点更新。。。。。。 代码:android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中,调用run方法。 android14中,在startOtherServices中启动WindowManagerService 该代码执行了WMS的main方法,会在内部创建一个WMS。其中有一个参数inputManager也是在

    2024年02月05日
    浏览(42)
  • Android Display架构分析,黑屏,系统架构

    (642条消息) Android Display架构分析_lin-0410的博客-CSDN博客 (644条消息) Android系统架构_橙子19911016的博客-CSDN博客 1 Android 系统架构 Android 是谷歌开发的一款基于 Linux 内核的操作系统。系统架构分为五层,从下到上依次是Linux内核层、硬件抽象层、系统运行库层、应用框架层和应用

    2023年04月26日
    浏览(43)
  • Android 应用资源概览

    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 我们继续总结学习 Android 基础知识 ,温故知新。 资源是指代码使用的附加文件和静态内容,例如位

    2024年02月05日
    浏览(29)
  • Android Audio开发——概览(一)

            Audio 是 Android 系统中比较重要的一个模块,在 Android 中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。         Android 音频架构定义了音频功能的实现方式,并指出实现中所涉及的相关源代码。 应用框架         应用框架包含应用代码,该

    2024年02月10日
    浏览(44)
  • Android NDK开发详解之调试和性能分析的系统跟踪概览

    “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件,该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍,请参阅 Perfetto 文档中的跟踪 101 页面。 Android 平台提供了多种不同的跟踪记

    2024年02月06日
    浏览(52)
  • 【vim进阶】vim编辑器的分屏操作(分屏显示文件,关闭分屏,分屏间光标的移动,移动分屏)

    VIM 可以实现分屏操作,一个屏幕被多个文件给分占,有左右和上下两种分屏的方式。 左右分屏如下操作: n是数字,表示分屏的数量,n要大于等于文件个数 上下分屏如下操作: 这个命令跟上一个命令不同的是其中的参数 -on( n 是要打开的具体文件的数目:1,2,3 …) 中的 o

    2024年02月14日
    浏览(46)
  • Arcade 分屏例子1

    这段代码演示了如何将屏幕分成两个部分,并根据所选的部分来选择一个框。 代码的主要结构如下: 首先定义了一个名为Box的类,它继承自arcade.SpriteSolidColor类,表示屏幕上的一个绿色方框。 然后定义了一个名为ScreenPart的类,它继承自arcade.Section类,表示屏幕上的一个部分

    2024年04月23日
    浏览(28)
  • UE4 分屏显示

    比较简单,直接附上蓝图。 注意:(启动模式选择独立游戏进程启动这样能够在两个屏幕上满屏显示,在UE4 版本上可以实现,不清楚在UE5上实现不了在两个屏幕上满屏显示),有疑惑或者想法这欢迎沟通交流。 还要注意设置项目里面的屏幕设置 下面附上简单的分屏Demo ,UE版

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包