13.2 App Widget的使用和实现

App Widget俗称“桌面小工具”,指的是内嵌在其他宿主应用(最常见的宿主应用就是桌面)中定期提供本应用内容的视图工具,是向用户提供其应用信息和操作的窗口。与简单的快捷方式相比,App Widget会占据桌面上更多的交互空间,同时它也能承载更丰富的信息,提供更便捷的操作入口,进而提升用户体验。

比如:天气小工具可以帮助用户了解最新的天气状况(如图13-2所示);电量小工具可以帮助用户更直观地把握当前设备的电力状况,并快速变更节电方案;而联系人小工具则可以使用户能快速地找到常用的联系人信息。

对于每个Android应用,开发者都需要仔细思考是否需要为该应用提供相应的App Widget,使得用户可以更方便地获取应用提供的信息,更便捷地使用应用。当然,桌面能够展示的空间有限,寸土寸金的竞争,应用需要在App Widget设计上有足够的特色才能胜出。

13.2 App Widget的使用和实现 - 图1

图 13-2 一些App Widget的示例

13.2.1 Android的App Widget框架

Android的App Widget框架,由三部分构成。首先是App Widget提供应用(App Widget Provider),它负责实现App Widget的功能和界面,并提供App Widget需要呈现的内容信息。

另一个重要部分是App Widget宿主应用(App Widget Host),它负责将来自各个提供应用的App Widget对象构造并呈现出来。

除此之外,为了使得整体架构更为灵活,将App Widget提供的应用与App Widget的宿主应用完全解耦,Android提供了App Widget管理服务(AppWidgetService)。与其他系统服务一样,App Widget管理服务运行于Android核心进程的独立线程内。它负责从App Widget提供的应用中收集所有App Widget信息,并将这些信息提供给App Widget宿主应用,同时,App Widget管理服务还会帮助宿主应用进行App Widget对象的构造和管理。

从实现的角度来看,App Widget实质上是一类触发器组件,它派生自android.appwidget.AppWidgetProvider对象。AppWidgetProvider是触发器组件的子类,用来接收特定的广播事件,捕获与App Widget对象相关的创建、更新和销毁等消息。App Widget提供的应用需要在配置文件中对App Widget的组件信息进行声明:


<receiver android:name=".SampleAppWidget">

<intent-filter>

<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>

</intent-filter>

<meta-data android:name="android.appwidget.provider"

android:resource="@xml/appwidget_config"/>

</receiver>


与一般的触发器组件配置不同,App Widget的配置信息中需要使用<meta-data>扩展域[1]来进一步描述App Widget的详细信息。该meta域的键为android.appwidget.provider,值指向一个资源文件,文件格式示例如下[2]


<?xml version="1.0"encoding="utf-8"?>

<appwidget-provider

xmlns:android="http://schemas.android.com/apk/res/android"

android:minWidth="294dip"

android:minHeight="146dip"

android:updatePeriodMillis="900000"

android:initialLayout="@layout/appwidget_layout">

</appwidget-provider>


该资源文件中的描述信息,会被读取到一个android.appwidget.AppWidgetProviderInfo对象中,该对象中描述了App Widget的内容更新频率、占据的尺寸、视图的样式等信息。

App Widget管理服务会扫描所有应用提供的App Widget配置信息,并将这些信息通过android.appwidget.AppWidgetManager对象提供给宿主应用。每个App Widget宿主应用都需要实现并构造一个android.appwidget.AppWidgetHost对象,利用AppWidgetHost来构造和管理App Widget对象,同时通过AppWidgetHost建立与App Widget管理服务的PRC连接,等待App Widget管理服务发出指令。

调用AppWidgetHost.allocateAppWidgetId函数可以为App Widget对象分配一个标识Widget Id。App Widget管理服务会统一管理和分配Widget Id,该id是App Widget提供应用、宿主应用和管理服务间确认具体App Widget对象的唯一依据。

比如,当App Widget对象中的信息需要更新时,提供应用会调用AppWidgetManager.updateAppWidget函数将Widget Id和需要更新的内容发送到App Widget管理服务中。App Widget管理服务通过Widget Id,找到其对应宿主应用的AppWidgetHost对象,将与该App Widget对象对应的变化通知给宿主应用,从而完成App Widget对象的内容更新(大致流程如图13-3所示)。

13.2 App Widget的使用和实现 - 图2

图 13-3 App Widget相关的模块构成及其基本交互流程

[1]关于应用配置及<meta-data>的使用,可以参见第3章。

[2]关于Widget配置文件的更多信息,可以参见Android SDK文档:http://developer.android.com/guide/topics/appwidgets/index.html#MetaData。