在智能手机和平板电脑日益普及的今天,用户对设备的操作体验提出了更高的要求。多窗口功能作为提升用户体验的重要特性之一,允许用户同时进行多项任务,如边看视频边聊天,或者边玩游戏边查看攻略。本文将探讨Android系统中多窗口功能的发展历程、实现方法以及在不同版本系统中的变化,并提供一些优化技巧。
多窗口功能最早可以追溯到2012年6月,当时开发出了首个开源的多任务框架Cornerstone。紧接着在同年8月,三星推出了首款支持多窗口的商业产品。从2013年至今,市场上涌现出了大量多窗口解决方案。
多窗口功能通常包括悬浮风格和停靠风格两种。悬浮风格允许窗口自由移动和调整大小,而停靠风格则将窗口固定在屏幕的一侧。此外,多窗口功能通常包含打开/关闭、调整大小和交换窗口位置等操作。
2013年,市场上出现了多种由OEM/ODM、ISV以及开源社区开发的多窗口解决方案。下表对不同的多窗口解决方案进行了比较。
特性 | Cornerstone | Standout | Xposed | Tieto |
---|---|---|---|---|
描述 | 为Android OS开发的多任务框架 | 开源库,用于创建悬浮应用 | 支持停靠窗口风格的多窗口应用 | 旨在创建类似桌面的用户体验 |
打开/关闭, 调整大小, 最大化 | 支持 | 支持 | 支持 | 支持 |
窗口风格 | 停靠 | 悬浮 | 停靠 | 悬浮/停靠 |
代码修改 | Android框架 | 应用层 | Android框架 | Android框架 |
应用支持 | 支持所有应用,但SurfaceView不能动态调整 | 部分辅助应用,如计算器等 | 应用兼容性和稳定性需改进 | 支持所有应用 |
Android版本 | 4.1~4.4 | 4.1~ | 4.4 | 4.4 |
官方网站 |
为了适应更多的功能,可以通过修改Android框架代码来实现。对于Android 4.2和Android 4.3,启动器和其他应用都运行在名为"main stack"的一个栈上。而多窗口需要更多的栈来容纳多个窗口,因此需要修改框架中的ActivityManagerService
类来添加栈的创建和管理接口。为了适应视图,需要修改框架中的WindowManagerService
类,同时还需要修改框架中的inputManager来将触摸事件分发到相应的窗口。
当Android 4.4和Android 5.0发布时,栈管理发生了显著变化。启动器和其他应用可以运行在不同的栈上。增加了栈和栈管理功能。下图显示了Android 4.3和Android 4.4之间栈管理的变化。
众所周知,Android OS使用回调方法来触发活动接口功能。但主要功能是在框架上实现的,因此将介绍两个重要的类ActivityManagerService
和WindowManagerService
。
由于多窗口功能依赖于栈,以下展示了如何创建一个栈以及如何在栈上启动一个活动。在Lollipop中,IactivityManager.java
增加了以下接口函数。
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中 |
在Lollipop中,adb(android debug bridge)增加了以下命令。
ADB命令 | 功能 | 描述 |
---|---|---|
Adb shell am stack start |
启动一个新的活动 | 在 |
Adb shell am stack movetask |
移动任务 | 将 |
Adb shell am stack resize |
调整栈大小 | 改变 |
多窗口具有调整大小的功能。见过一些游戏动画无法调整大小的情况。根本原因是Android功能SurfaceFlinger不能动态调整大小。
另一个问题是一些应用程序在多窗口中显示不正确。下面的例子显示了计算器在多窗口中显示不正确,因为应用程序使用了不良的兼容性配置。
Google是否会在其下一版本的操作系统中发布多窗口功能。在Lollipop源代码中找到了以下日志信息。使用以下命令搜索多窗口日志。
git log --grep "multiwindow"
日志内容包含一行,内容为"defer tap outside stack until multiwindows"。因此得出结论,多窗口可能在Google的路线图上。
Onskreen开发了首个多窗口框架解决方案Cornerstone。它适用于大屏幕设备和平板电脑。可以从GitHub下载源代码。它仅支持Android 4.1和Android 4.2版本。尚未发布在更高版本的Android上。但可以分析Android 4.2的源代码,以获取更多的技术细节。