Android多窗口功能的实现与优化

在智能手机和平板电脑日益普及的今天,用户对设备的操作体验提出了更高的要求。多窗口功能作为提升用户体验的重要特性之一,允许用户同时进行多项任务,如边看视频边聊天,或者边玩游戏边查看攻略。本文将探讨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使用回调方法来触发活动接口功能。但主要功能是在框架上实现的,因此将介绍两个重要的类ActivityManagerServiceWindowManagerService

由于多窗口功能依赖于栈,以下展示了如何创建一个栈以及如何在栈上启动一个活动。在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 启动一个新的活动 上使用Intent启动一个新的活动
Adb shell am stack movetask 移动任务 从当前栈移动到STACK_ID的顶部或底部
Adb shell am stack resize 调整栈大小 改变的大小和位置到

多窗口的常见问题

多窗口具有调整大小的功能。见过一些游戏动画无法调整大小的情况。根本原因是Android功能SurfaceFlinger不能动态调整大小。

另一个问题是一些应用程序在多窗口中显示不正确。下面的例子显示了计算器在多窗口中显示不正确,因为应用程序使用了不良的兼容性配置。

Android下一版本是否支持多窗口

Google是否会在其下一版本的操作系统中发布多窗口功能。在Lollipop源代码中找到了以下日志信息。使用以下命令搜索多窗口日志。

git log --grep "multiwindow"

日志内容包含一行,内容为"defer tap outside stack until multiwindows"。因此得出结论,多窗口可能在Google的路线图上。

案例研究:Cornerstone

Onskreen开发了首个多窗口框架解决方案Cornerstone。它适用于大屏幕设备和平板电脑。可以从GitHub下载源代码。它仅支持Android 4.1和Android 4.2版本。尚未发布在更高版本的Android上。但可以分析Android 4.2的源代码,以获取更多的技术细节。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485