什么是桌面微件
App Widget 是挂在桌面启动器上的一块小界面。它不用打开应用,就能在桌面上显示天气、待办、音乐进度。用户长按桌面就能把它摆上来,这是应用触达用户的轻量入口。
桌面微件是应用伸到用户桌面上的一只手,看一眼就能拿到关键信息。
这篇把怎么做一个安卓桌面微件走一遍。
RemoteViews 的限制
微件的界面跑在启动器进程里,你的进程碰不到它的 View 树,只能用 RemoteViews 远程描述。这意味着能用的控件有限:不支持随便的自定义 View,布局也有一套白名单。想要复杂交互,点一下跳进真正的应用里做。
微件速查
- RemoteViews在启动器进程里画界面。
- 控件受限只用白名单布局和控件。
- 点跳应用复杂交互进 App 里做。
定义一个微件
三要素:一个 RemoteViews 布局、一个 AppWidgetProvider 广播接收器、一份描述元数据的 xml。元数据里写清楚最小尺寸、更新周期、预览图。配好后用户就能在微件列表里看到它。
<appwidget-provider
android:minWidth="110dp"
android:minHeight="40dp"
android:updatePeriodMillis="1800000">
</appwidget-provider>
元数据定好了,微件才知道该多大、多久刷一次。
更新微件数据
微件显示的数据靠 RemoteViews 局部更新:拿到 RemoteViews 实例,setText 改文字、setImageViewBitmap 换图,再用管理器整体推回去。不要每次重画整棵树,只动变了的部分,省电省内存。
点微件跳页面
微件上的按钮不能直接写点击逻辑,要用 PendingIntent 包一个跳转意图。点卡片就打开主页面、点按钮就执行某个动作。PendingIntent 相当于替你在未来去触发一次操作。
- PendingIntent 包好跳转意图。
- setOnClickPendingIntent 绑到控件。
- 复杂逻辑交给应用内页面。
尺寸与预览
现在的安卓支持可拉伸微件,用户能自由拖大小。给不同尺寸准备对应的布局,再加一张预览图,让用户在挑选微件时就知道摆上去长什么样。预览做得好,被添加的概率就高。
实战:待办计数卡
做一个在桌面显示待办条数的小卡片。
val rv = RemoteViews(packageName, R.layout.widget_todo)
rv.setTextViewText(R.id.tvCount, "${todoCount} 条待办")
manager.updateAppWidget(id, rv)
数据变了就 updateAppWidget 推一次。微件做到这份上,用户不用打开应用,看一眼桌面就知道今天还有多少事。