使用多窗口功能作为 Android 上的差异化





0/5 (0投票)
本文将介绍多窗口功能,并展示如何在您的应用中实现它。
Intel® 开发者中心 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,帮助开发者创新并取得成功。加入我们的社区,了解 Android、物联网、Intel® 实感™ 技术和 Windows,下载工具、获取开发套件、与志同道合的开发者交流想法,并参与黑客松、竞赛、路演和本地活动。
概述
多窗口是 Android* 操作系统的一项功能,可以使您的应用与众不同。许多 OEM 和 ODM,如三星、Ramos 和华为,都利用此功能来推广他们的产品并使其脱颖而出。本文将介绍多窗口功能,并展示如何在您的应用中实现它。
引言
2012 年 6 月,第一个开源多任务处理框架 Cornerstone 应运而生。2012 年 8 月,三星推出了首款多窗口商用产品。从 2013 年至今,市场上涌现出大量多窗口解决方案(参见图 2)。
两种多窗口样式是:浮动样式和停靠样式。多窗口功能通常包括打开/关闭、调整大小和交换功能。打开/关闭功能用于启动/停止该功能。调整大小功能允许用户更改窗口大小。交换功能用于交换窗口位置。
2013 年,OEM/ODM、ISV 和开源社区开发了许多解决方案,并在市场上出现。下表比较了不同的多窗口解决方案。
功能 | Cornerstone | Standout | Xposed | Tieto |
描述 | Android* OS 的多任务处理框架 | 一个开源库,可用于创建浮动应用 | 支持停靠窗口样式的一个多窗口应用程序 | 该项目旨在创造类似桌面用户的体验 |
打开/关闭、调整大小、最大化 | 支持 | 支持 | 支持 | 支持 |
窗口样式 | 停靠 | 浮点 | 停靠 | 停靠/浮动 |
代码修改 | Android 框架 | 应用层 | Android 框架 | Android 框架 |
应用程序支持 | 支持所有应用程序,但 SurfaceView 无法动态调整 | 一些辅助应用程序,例如计算器等。 | 应用程序兼容性和稳定性需要改进 | 支持所有应用程序 |
Android 版本 | Android 4.1 ~ Android 4.4 | Android 4.1~ Android 4.4 |
Android 4.4 | Android 4.4 |
官方网站 | http://www.onskreen.com | http://forum.xda-developers.com/showthread.php?t=1688531 | http://forum.xda-developers.com/xposed | https://github.com/tieto/multiwindow_for_android |
软件架构
您可以修改 Android 框架代码以适应更多功能。Android OS 架构分为多个层次。
对于 Android 4.2 和 Android 4.3,启动器和其他应用程序都在一个堆栈上运行,称为“主堆栈”。众所周知,多窗口需要更多的堆栈来容纳多个窗口,因此我们需要修改框架中的 ActivityManagerService
类,以添加堆栈创建和堆栈管理接口。为了修改框架中的 WindowManagerService
类以适应视图,我们需要修改框架的 inputManager 以将触摸事件分派到相应的窗口。
随着 Android 4.4 和 Android 5.0 的发布,堆栈管理发生了重大变化。启动器和其他应用程序可以在不同的堆栈上运行。添加了堆栈和堆栈管理功能。下面显示了 Android 版本之间的堆栈差异。
让我们关注代号为 Lollipop 的 Android 5。我们知道,Android* OS 使用回调方法来触发 activity 接口函数。但主要功能是在框架中实现的,因此我们将介绍两个重要类 ActivityManagerService
和 WindowManagerService
。
Lollipop Activity 管理
由于多窗口功能依赖于堆栈,以下展示了如何创建一个堆栈以及如何在堆栈上启动 activity。
在 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
进程将启动 activity 管理服务和窗口管理服务。我们可以添加 RuntimeException
语句来跟踪该过程。
现在,让我们展示如何在堆栈上启动 activity。
在 Lollipop 中,adb (android debug bridge) 添加了以下命令。
表 3. Lollipop 的新 adb 命令
ADB 命令 | 函数 | 描述 |
Adb shell am stack start | 使用 Intent 在 <DISPLAY_ID> 上启动新 activity |
Kitkat 4.4,adb 命令包含 adb shell am stack create。 Lollipop 5.0,adb 命令 adb shell am stack create deletion |
Adb shell am stack movetask | 将 <TASK_ID> 从其当前堆栈移动到 STACK_ID 的顶部或底部 |
用法:adb shell am stack movetask task_id stackid true/false 注意:在 KitKat 上可以,但在 Lollipop 上无效。 |
Adb shell am stack resize | 将 <STACK_ID> 的大小和位置更改为 <LEFT, TOP, RIGHT, BOTTOM> |
用法:adb shell am stack resize task_id weight |
Lollipop 窗口管理
WindowManagerService
是核心窗口管理器。其功能包括输入事件分发、屏幕布局和表面管理。
关于多窗口的一些常见问题
多窗口具有调整大小功能。我们见过游戏动画无法调整大小的情况。根本原因在于 Android 的 SurfaceFlinger 功能无法动态调整大小。
另一个问题是,某些应用程序在多窗口中显示不正确。下面的示例显示计算器在多窗口中显示不正确,因为该应用程序使用了糟糕的兼容性配置。
Android 的下一个版本会支持多窗口吗?
Google 会在其下一个版本的操作系统中发布多窗口功能吗?我在 Lollipop 源代码中找到了以下日志信息。我们使用以下命令搜索多窗口日志。
git log --grep "multiwindow"
日志内容中有一行写着“defer tap outside stack until multiwindows”。因此,我们可以得出结论,多窗口可能在 Google 的路线图中。
案例研究:Cornerstone
Onskreen 开发了 Cornerstone,这是第一个多窗口框架解决方案。它适用于大屏幕设备和平板电脑。您可以从 GitHub3 下载源代码。它仅支持 Android 4.1 和 Android 4.2 版本。尚未在更高版本的 Android 上发布。但我们可以分析 Android 4.2 的源代码以获取更多技术细节。
摘要
如今,许多移动设备都使用运行 Android OS 的 Intel® 处理器。开发者如何才能改善用户体验?他们的产品如何才能更好地竞争?这些问题促使我们在 Intel® 架构 (IA) 设备上不断改进我们的产品。多窗口是一个很好的差异化功能。它很方便,而且允许消费者同时做两件事情或更多事情。他们可以观看视频并与朋友进行视频聊天。他们可以玩游戏并阅读游戏评论。目前有几款设备支持多窗口功能:Ramos i12 平板电脑、Teclast x98 平板电脑以及使用 Remix OS 的 Cube i7。
参考
[1] http://www.onskreen.com/cornerstone/
[2] http://himmele.googlecode.com/svn/trunk/Google%20Android/Android%20Graphics%20Architecture.pdf
[3] https://github.com/Onskreen/cornerstone
Resource
关于作者
李亮(Li Liang)获得长春理工大学信号与信息处理硕士学位。他于 2013 年加入英特尔,担任开发者关系部门 CCE(客户端计算赋能)的应用工程师。他专注于帮助开发者在 Android 平台上实现应用差异化。