Android从开端支集多窗口,学术权威终极支集一概如此功用。。实际上,很多ODM商号曾经使掉转船头了一概如此功用。,多种使掉转船头方式,最公共用地的receiver 收音机是多栈编程序。,比较地疾苦的是每回版本晋级都要花很大力气举行适配连累杂多的乌七八糟的bug,现时完全地都同上。,同时第三方运用开端对多窗口举行适配亲和的。

    Android原始发生的多窗口功用比较地权力大的,支集四种制作模型:全掩藏、分屏、画中画、自在制作模型。眼前可以直系的或不坦率的吐艳。,相当多的bug。多窗口次要触及ActivityManagerService、WindowManagerService、输出三个模块,前两个模块完全地独特的复杂。,现时支集四种制作模型多窗口,全部的复杂性升起了几倍(ActivityManagerService简化AMS,WindowManagerService简化WMS)。

    本文达到目标占有这些剖析都是因为Android的。 7.1。

二、原始的构架零碎

        Android原始发生多窗口亦多Stack编程序,即,有多个运用零碎。。ActuviStac是单独转移的栈,每个堆栈都有本人的掩藏区域绑定和ID,运用在任命中建立组织并某方面在堆栈中。。譬如,桌面排出器、任命栏预先决议属于ID= HOMENTHOST堆栈。。譬如,左右屏制作模型,一概如此刻候左右有两个书架。,掩藏分为最大值和下凡两平衡。。

    AMS和WMS中对Stack区别用ActivityStack和TaskTack描绘,堆栈陈述。运用任命记载举行任命、Task描绘,经过TasKID陈述。AMS和WMS达到目标栈、任命堆栈挨次将在运用开端屯积使时间互相分歧。。每个窗口都有Z阶值。,同意在中间的,值越高,窗口越高。。窗口的Z阶值的计算也因为STAC。、任命堆栈挨次,一概如此堆栈在AMS、任命堆栈终极决议窗口的z挨次(不规则的事物)。

    AMS达到目标栈、任命堆栈的地位。堆栈栈存相信持续在的MSTACK中。。变量是对一对MSTACK的援用。,因而可以牧座对Stack栈的修补直系的在ActivityStack重大聚会中走完,譬如,免职电子。Task栈保在ActivityStack的mTaskHistory中。

    WMS达到目标堆栈、任命堆栈的地位。Stack栈同意在中间的。Task栈同意在中间的。

    每个Activity显示在所属ActivityStack的bound区域内,多个Activity显示在各自ActivityStack的bound区域内,乃就可以使掉转船头多窗口。另一方面自在制作模型下,运用的范围是由任命决议的。,而挑剔促使发生。多窗口何止仅是把持Activity放入不同的ActivityStack中,也使改变方向了运用的经济周期,即,居中 运用是一种回复资格,对立的事物可见的运用是使安静资格。,它不当心进入终止资格。。

    全部的零碎仅仅单独居中 Stack,单独Focus Activity。用户用手操作哪个运用,Focus 运用落到运用,Focus 堆栈点聚焦 运用栈。当心,画家的风格达到目标画家的风格制作模型,浮层运用不克不及译成居中 Activity,乃漂层属于堆栈而挑剔居中。 Stack。

    进入/自由的多窗口按以下逻辑构架零碎挨次举行处置:

        使移近1。修补运用堆栈

使移近2。修补任命堆栈

使移近3。修补运用堆栈,在WMS中修补AppWORKONT预兆:预示或象征堆栈

四分之一步。召唤运用经济周期重大聚会

使移近5。向WMS添加窗口

使移近6。超动画片和运用窗口显示

三、核心重大聚会

    FocusStack切换:()

    FocusActivity切换:()

运用经济周期:()

    修补堆栈上胶料:()

    运用启动:()

四、源码剖析

1、分屏制作模型

    进入分屏有两某类型的使入迷。:将任命栏达到目标联系掩藏缓慢前进到顶部;以第二位,支集分屏运用界间的并按下末端。进入联系掩藏后,上半掩藏区域崇高的DO。,下半区掩藏是联系掩藏后的任命栏。。越过两种进入掩藏召唤界间的的方式区大概()和。分屏后,经过下半掩藏任命栏,您可以选择启动以第二位拆分S。,呼叫交谈是。

    浅析两种分屏启动。将联系掩藏的话筒听筒缓慢前进到任命栏激励的顶部。,进入分屏制作模型,召唤的交谈是。进入分屏屯积PhoneActivity属于id=1(FullScreenStack),任命栏预先决议属于ID=0(HomeStack)。,Focus 堆栈落到主页。进入拆移掩藏相当于启动话筒运用。,把它放在堆起来或覆盖住的上半部,该区域的上半平衡是DokdStad(ID=3)。,立刻PhoneActivity从id=1(FullScreenStack)移到id=3的DockedStack中,末尾,霍姆斯塔克的约束
resize,鄙人半区掩藏上。分屏后关怀居中 堆栈点到该区域的上半平衡停靠 Stack。全部的序列列举如下所示。

   按下末端任命扣上钮扣支集分屏运用界间的。,进入分屏制作模型,召唤的交谈是。进入分屏相当于把PhoneActivity从id=1移到id=3的DockedStack中,同时,修补上胶料 HomeStack。当心这种方式分屏后,Focus 堆栈落到家常的 Stack。挨次图列举如下,可以看出,这种方式进入子掩藏召唤两个AMS交谈。。

   在剖析源码快跑中显示证据了单独风趣的Activity属性FLAG_RESUME_WHILE_PAUSING,代表先前的运用 使安静毫不迟疑回复,可以放慢运用启动。

    启动以第二位分屏运用程序,运用缺乏的堆栈暗中免职,仍做FullScreenStack(id=1),同时FullScreenStack和HomeStack的bound在启动第单独分屏运用时曾经比得上[0, 0, dw, DH] – DockedStack bound,乃,只需将全掩藏幕堆栈移到堆栈堆栈的顶部那就够了。。可能会有忧虑FultStudio Stad绑定的成绩。,它挑剔说全掩藏吗?,怎样以第二位个分屏运用谎言FullScreenStack中,实际上,FultStudio的堆栈更精确的了解是:在非多窗口制作模型下即全掩藏制作模型下,FullScreenStack第三方运用启动;联系掩藏制作模型被用作以第二位联系掩藏堆栈。;画中画和自在制作模型下FullScreenStack某方面全掩藏Activity。以第二位个分屏运用启动挨次图列举如下。

    画家的风格达到目标画家的风格是运用的顶峰。,运用窗口前后谎言占有窗口的顶部,堆栈属于占有堆栈。,这种特别的堆栈崇高的PinnedStack(ID=4)。。PoNodStad不克不及译成居中 Stack,运用不克不及译成居中 Activity,核心事变是不会有的接到的。,也不克不及译成输出法的居中窗口(剪下Android) 7.1.1,点击PIP运用输出框伸出输出窗口。,但无法输出),另一方面你可以接纳触摸事变(同时不断地很多bug),譬如,ListVIEW不克不及滑动等。。

  如安在画家的风格中开端画家的风格,很复杂,只需在AndroidManifest中口供Activity时添加android:supportsPictureInPicture=”true”和android:resizeableActivity=”true”属性,在Activity内地召唤enterPictureInPictureMode()便可启动画片中画制作模型。Pin Nead栈的默许上胶料为[0,0,100, 100],必要修正/frameworks/base/core/res/res/values/证明

  某人说,PinnedStack是不成聚焦的。 stack,运用无居中 activity,resumeFocusedStackTopActivityLocked()只会将stack堆栈中Focus Stack的focus 运用简历,任何的对立的事物运用使安静或终止。,乃图片运用做使安静资格。。画中画制作模型启动挨次图列举如下。

PinnedStack stacks栈的核心逻辑。仅仅两个某方面来修补堆栈序列:当单独新的运用平台触发时,必要添加到堆栈栈;②运用启动必要Stack移到最显著的位置即召唤()。顶部的核心逻辑是在()中加关键。,即,另单独堆栈到免职的顶部。,假使顶端是PinnedStack,这么就放在PinnedStack下面单独地位(PinnedStack是always on
顶部)。

3、自在制作模型

    自在制作模型胜利列举如下,PC视窗何止仅是滑稽模仿,从任命栏开端。下图中三个Activity均状态自在制作模型下,此刻不当心对应于它的三个堆栈。,但仅仅单独自在使体式化 堆栈(StAdID=2)希腊字母第12字三个任命。在这种制作模型下,挑剔堆栈决定运用拟出的地位。 bound,它的任命 bound,即,每个任命都有本人的约束。。

默许影响下闭上该制作模型。,必要人工控制启用,末端的可以输出以下命令。

  下面说了自在制作模型下Activity从Recents中启动,召唤的交谈是,其时序跟从任命栏缓慢前进单独运用进入分屏相像的人,就在喂,运用是自在使体式化的。 栈启动,对立的事物根本快跑根本分歧。,不再剖析。

4、窗口修补上胶料/缓慢前进

在分屏制作模型下,缓慢前进中间的条棒使改变方向掩藏的上胶料,中间的bar条是SystemUI添加到零碎单独名为“DockedStackDivider”的浮窗,接纳触摸事变,理由静态事变的Y值静态召唤停靠 堆栈的绑定上胶料,窗口上胶料修补的走完,下面曾经举行了剖析,喂不再剖析。

    在自在制作模型下的窗口缩放和拖拽跟分屏制作模型不同的上,不当心SystemUI的酒吧漂窗口,另一方面在自在制作模型下DecorView与子Content 在风景暗中拔出单独DealCabVIEW风景,指定遗传密码列举如下所示。

   窗口修补跟拖拽便是在DecorCaptionView中理由触摸事变检测开启的,召唤的翻开重大聚会是(IWindows) window, float startX, float startY)。拖曳和拖曳。,用户按下自在体式 运用的窗口边沿和免职,拖曳快跑分为三个使移近:

  触摸事变检测,显示证据是一种阻碍或窗口修补,和,穿插稳定的进程召唤()翻开任命免职。;

  将找到单独任命保持着。,TaskPositioner会对齐单独InputChannel到InputManager中,随后的触摸事变将被发发出信息TaskPositioner。;

  接纳免职事变,计算窗口 和召唤(int) taskId, Rect bounds, int ResiZimeDE修正运用窗口绑定。

    全部的快跑比较地复杂。,津贴本性剖析。

5、自在制作模型下触摸事变

    在触摸事变实施快跑中,事变是由InputDispatcher经过socket直系的发发出信息Focus运用稳定的进程窗口,这挑剔全掩藏运用达到目标成绩。。另一方面在自在制作模型下,列举如下图所示,Focus activity是Setting,点击事变围绕在QQ围绕窗口次要的置窗口。,这次事变将不复回送到居中。 运用设置发送到QQ围绕,同时,QQ围绕的运用也将译成居中。 Activity。

发表评论

电子邮件地址不会被公开。 必填项已用*标注