多窗口是 Android* 操作系统具备的一项特性,可让您的应用变得与众不同。 许多原始设备制造商 (OEM) 以及原始设计制造商 (ODM),比如三星、蓝魔和华为,都使用该特性进行产品推广,并取得了良好的效果。 本文将介绍多窗口特性,并展示如何在应用中实施该特性。 图 1. 多窗口使用案例 简介2012 年 6 月,首款名为 Cornerstone 的开源多任务处理框架研发成功。 2012 年 8 月,三星发布了第一款多窗口商用产品。 从 2013 年到现在,市场上的多窗口解决方案呈**式增长(见图 2)。 图 2. 多窗口演进 多窗口主要呈现两种风格:悬浮风格和停靠风格. 多窗口特性通常包含开启/关闭、调整大小和切换 (swap) 功能。 开启/关闭功能能够启动/停止该特性。 调整大小功能支持用户改变窗口的大小。 切换功能可交换窗口的位置。 图 3. 多窗口的窗口风格 2013 年,多款由 OEM/ODM、ISV 或开源社区开发的解决方案相继面市。 下表将不同多窗口解决方案进行了对比。 特性 Cornerstone Standout Xposed Tieto
描述面向 Android* 操作系统的多任务处理框架可用于创建浮动应用的开源库支持停靠窗口风格的多窗口应用该项目旨在打造类似台式机的用户体验
开启/关闭,调整大小,最大化支持支持支持支持
窗口风格停靠浮动停靠停靠/浮动
代码修改Android 框架应用层Android 框架Android 框架
应用支持支持所有应用,但 SurfaceView 无法动态调整部分辅助应用,例如计算器等。需提高应用兼容性和稳定性支持所有应用
Android 版本Android 4.1 ~Android 4.4Android 4.1~
Android 4.4Android 4.4Android 4.4
官方网站http://www.onskreen.comhttp://forum.xda-developers.com/showthread.php?t=1688531http://forum.xda-developers.com/xposedhttps://github.com/tieto/multiwindow_for_android软件架构你可以调整 Android 框架代码以适应更多功能。 Android 操作系统架构可以分层。 就 Android 4.2 和 Android 4.3 来说,启动器和其他应用均在一个堆栈上运行,称为 “主堆栈”。 众所周知,多窗口需要较多堆栈以包含多个窗口,因此我们需要调整框架的类 ActivityManagerService,从而添加堆栈创建和堆栈管理界面。 为方便查看而调整框架的类 WindowManagerService,我们需要调整框架的 inputManager,以将触控事件分派给相应的窗口。 新发布的 Android 4.4 和 Android 5.0 对堆栈管理做出了重大调整。 启动器和其他应用在不同堆栈上运行, 并添加了堆栈和堆栈管理功能。 如下所示为不同的 Android 版本在堆栈方面的区别。 图 4. Android* 4.3 和 Android 4.4 的堆栈管理差异 我们现在重点来看 Android 5(代号 “Lollipop”)。 我们都知道,Android* 操作系统使用回调方法触发活动界面功能。 但主要功能在框架上执行,因此我们来介绍两个重要的类:ActivityManagerService 和 WindowManagerService。 图 5. Lollipop 的软件结构 Lollipop 活动管理由于多窗口特性主要依靠堆栈,因此我们下面来介绍如何创建堆栈,以及如何在堆栈上启动活动。 在 Lollipop 中,IactivityManager.java 添加了以下界面功能。 表 1. Lollipop 源代码更改 IactivityManager.java 新增界面功能 描述
public void moveTaskToStack(int taskId, int stackId, boolean toTop)将任务移到另一个堆栈上
public void resizeStack(int stackBoxId, Rect bounds)调整堆栈大小
public void setFocusedStack(int stackId)设置当前焦点堆栈
Public Boolean isInHomeStack(int taskId)无论是否在 HomeStack 中都获取任务启动后,SystemServer 流程将启动活动管理服务和窗口管理服务。 我们可以添加 RuntimeException 语句,以追踪该流程。
图 6. Lollipop 中的堆栈创建进展 现在我们来看看如何在堆栈上启动活动。
|