由于AppWidget位于主屏幕上,因此它们必须与在主屏幕上建立的导航共存。与全屏应用相比,这样会使AppWidget只能支持有限的手势。例如,虽然应用可能支持可让用户在屏幕之间横向导航的视图翻页工具,但在主屏幕上已采用该手势,其作用是在主屏幕面板之间导航。
只能对微件使用以下手势:
- 轻触
- 纵向滑动
AppWidget布局基于
RemoteViews,并不是每种布局或视图微件都受其支持。
因而AppWidget可以支持以下布局类:
- FrameLayout
frameworks/base/core/java/android/widget/FrameLayout.java- LinearLayout
frameworks/base/core/java/android/widget/LinearLayout.java- RelativeLayout
frameworks/base/core/java/android/widget/RelativeLayout.java- GridLayout
frameworks/base/core/java/android/widget/GridLayout.java以及以下Widget类:
- AnalogClock
frameworks/base/core/java/android/widget/AnalogClock.java- Button
frameworks/base/core/java/android/widget/Button.java- Chronometer
frameworks/base/core/java/android/widget/Chronometer.java- ImageButton
frameworks/base/core/java/android/widget/ImageButton.java- ImageView
frameworks/base/core/java/android/widget/ImageView.java- ProgressBar
frameworks/base/core/java/android/widget/ProgressBar.java- TextView
frameworks/base/core/java/android/widget/TextView.java- ViewFlipper
frameworks/base/core/java/android/widget/ViewFlipper.java- ListView
frameworks/base/core/java/android/widget/ListView.java- GridView
frameworks/base/core/java/android/widget/GridView.java- StackView
frameworks/base/core/java/android/widget/StackView.java- AdapterViewFlipper
frameworks/base/core/java/android/widget/AdapterViewFlipper.java
不支持这些类的后代。
RemoteViews 还支持ViewStub,它是一个大小为零的不可见视图,您可以使用它在运行时以懒散的方式扩充布局资源。
查看Android官网 构建应用微件

frameworks/base/core/java/android/appwidget
frameworks/base/core/java/android/widget/RemoteViews.java
Androidstudio中创建
Widget->App Widget
![]()
使用 AppWidgetProvider 类
接收应用微件广播 Intent
ListView 一种在垂直滚动列表中显示项目的视图。有关示例,请查看 Gmail 应用微件。
GridView 一种在二维滚动网格中显示项目的视图。有关示例,请查看"书签"应用微件。
StackView 一种堆叠式卡片视图(有点像名片盒),用户可以分别向上/向下翻动前面的卡片来查看上一张/下一张卡片。示例包括 YouTube 和"图书"应用微件。
AdapterViewFlipper 一种由适配器支持的简单 ViewAnimator,可以在两个或更多视图之间呈现动画效果。一次只显示一个子级。
如上所述,这些集合视图显示由远程数据支持的集合。这意味着,它们使用 Adapter 将其界面绑定到其数据。Adapter 将一组数据中的各个项目绑定到各个 View 对象。由于这些集合视图由适配器支持,因此 Android 框架必须包含额外的架构来支持它们在应用微件中的使用。在应用微件的上下文中,Adapter 被 RemoteViewsFactory 取代,后者只是 Adapter 接口的瘦封装容器。请求集合中的特定项目时,RemoteViewsFactory 会为集合创建相应项目并将其作为 RemoteViews 对象返回。要在应用微件中添加集合视图,您必须实现
RemoteViewsService 和 RemoteViewsFactory。
RemoteViewsService是允许远程适配器请求 RemoteViews 对象的服务。RemoteViewsFactory 是集合视图(ListView、GridView 等等)与该视图的底层数据之间的适配器的接口(查看 StackWidget 示例)。
要使包含集合的应用微件能够绑定到 RemoteViewsService,您还必须在清单文件中使用
BIND_REMOTEVIEWS权限来声明该服务。这样可防止其他应用自由访问您的应用微件的数据。
对 AppWidget 布局 XML 文件的主要要求是它必须包含某个集合视图:
ListView、GridView、StackView 或 AdapterViewFlipper。下面是 StackWidget 示例的 widget_layout.xml:
除了整个应用微件的布局文件之外,您必须再创建一个布局文件,用来定义集合中每个项目的布局(例如,一套图书中每本图书的布局)。StackWidget 示例只有一个布局文件 widget_item.xml,因为所有项目使用同一布局。

AppWidgetDemo
待续~~