1.小组件声明
在<application>中声明<receiver>,相当于是注册广播接收者
<receiver android:name=".TestWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
<action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/test_widget" />
</receiver>
其中必须有<meta-data>,name固定为"android.appwidget.provider",resource指定小组件的UI样式:
test_widget.xml定义在res/xml/目录下:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="54dp"
android:minHeight="54dp"
android:updatePeriodMillis="1800000"
android:initialLayout="@layout/layout_test_widget"
android:previewImage="@drawable/icon_hot_spot_label"
android:resizeMode="horizontal"
android:widgetCategory="keyguard|home_screen">
</appwidget-provider>
其中widgetCategory指定了 widget 能显示的地方:能否显示在 home Screen 或 lock screen 或 两者都可以。previewImage指定在小组件管理工具里的图标,initialLayout指定挪到桌面上之后的样式:
layout_test_widget.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="52dp"
android:layout_height="52dp"
android:scaleType="fitXY"
android:src="@drawable/icon_hot_spot_label" />
</FrameLayout>
有了上述声明和定义,在小组件管理工具里便能看到该小组件,即使没有.TestWidgetProvider类
2.小组件逻辑实现
逻辑实现便是依赖.TestWidgetProvider类,来处理<receiver>中定义的不同action消息,这里简单举例,写个空壳类:
class TestWidgetProvider : AppWidgetProvider() {
override fun onUpdate(
context: Context?,
appWidgetManager: AppWidgetManager?,
appWidgetIds: IntArray?
) {
}
}
更多细节参看https://blog.csdn.net/ymtianyu/article/details/115178619