65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2015年10月1日

CPOL

6分钟阅读

viewsIcon

9860

本文将介绍多窗口功能,并展示如何在您的应用中实现它。

Intel® 开发者中心 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,帮助开发者创新并取得成功。加入我们的社区,了解 Android物联网Intel® 实感™ 技术Windows,下载工具、获取开发套件、与志同道合的开发者交流想法,并参与黑客松、竞赛、路演和本地活动。

概述

多窗口是 Android* 操作系统的一项功能,可以使您的应用与众不同。许多 OEM 和 ODM,如三星、Ramos 和华为,都利用此功能来推广他们的产品并使其脱颖而出。本文将介绍多窗口功能,并展示如何在您的应用中实现它。

图 1. 多窗口用例

引言

2012 年 6 月,第一个开源多任务处理框架 Cornerstone 应运而生。2012 年 8 月,三星推出了首款多窗口商用产品。从 2013 年至今,市场上涌现出大量多窗口解决方案(参见图 2)。

图 2. 多窗口演变

两种多窗口样式是:浮动样式和停靠样式。多窗口功能通常包括打开/关闭、调整大小和交换功能。打开/关闭功能用于启动/停止该功能。调整大小功能允许用户更改窗口大小。交换功能用于交换窗口位置。

图 3. 多窗口样式

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 版本之间的堆栈差异。

图 4. Android* 4.3 和 Android 4.4 之间的堆栈管理更改

让我们关注代号为 Lollipop 的 Android 5。我们知道,Android* OS 使用回调方法来触发 activity 接口函数。但主要功能是在框架中实现的,因此我们将介绍两个重要类 ActivityManagerServiceWindowManagerService

图 5. Lollipop 的软件结构

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 语句来跟踪该过程。

图 6. Lollipop 中堆栈创建过程

现在,让我们展示如何在堆栈上启动 activity。

图 7. 在堆栈上启动 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 是核心窗口管理器。其功能包括输入事件分发、屏幕布局和表面管理。

图 8. WindowManagerService 在图形架构中的作用2

关于多窗口的一些常见问题

多窗口具有调整大小功能。我们见过游戏动画无法调整大小的情况。根本原因在于 Android 的 SurfaceFlinger 功能无法动态调整大小。

图 9. 使用 SurfaceFlinger 的游戏无法动态调整窗口大小

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

图 10. 配置错误的计算器

Android 的下一个版本会支持多窗口吗?

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

git log --grep "multiwindow"

日志内容中有一行写着“defer tap outside stack until multiwindows”。因此,我们可以得出结论,多窗口可能在 Google 的路线图中。

图 11. 关于多窗口的 Lollipop 日志

案例研究:Cornerstone

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

图 12. Cornerstone 在 Jelly Bean 上的修改

摘要

如今,许多移动设备都使用运行 Android OS 的 Intel® 处理器。开发者如何才能改善用户体验?他们的产品如何才能更好地竞争?这些问题促使我们在 Intel® 架构 (IA) 设备上不断改进我们的产品。多窗口是一个很好的差异化功能。它很方便,而且允许消费者同时做两件事情或更多事情。他们可以观看视频并与朋友进行视频聊天。他们可以玩游戏并阅读游戏评论。目前有几款设备支持多窗口功能:Ramos i12 平板电脑、Teclast x98 平板电脑以及使用 Remix OS 的 Cube i7。

图 13. IA 设备上的多窗口功能

参考

[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

http://www.customizeblogging.com/2015/04/android-6-0-muffin-concept-video-shows-multi-windows-quick-reply-feats.html

关于作者

李亮(Li Liang)获得长春理工大学信号与信息处理硕士学位。他于 2013 年加入英特尔,担任开发者关系部门 CCE(客户端计算赋能)的应用工程师。他专注于帮助开发者在 Android 平台上实现应用差异化。

© . All rights reserved.