thinkphp 网站根目录地址,网络建设上市公司排名,一二三年级手工折纸,页面模板嵌入文章内Android 桌面小组件 AppWidgetProvider
简介
小组件就是可以添加到手机桌面的窗口。点击窗口可以进入应用或者进入应用的某一个页面。
widget 组件
如需创建 widget#xff0c;您需要以下基本组件#xff1a; AppWidgetProviderInfo 对象 描述 widget 的元数据#xff0…Android 桌面小组件 AppWidgetProvider
简介
小组件就是可以添加到手机桌面的窗口。点击窗口可以进入应用或者进入应用的某一个页面。
widget 组件
如需创建 widget您需要以下基本组件 AppWidgetProviderInfo 对象 描述 widget 的元数据例如 widget 的布局、更新频率和 AppWidgetProvider 类。AppWidgetProviderInfo 是使用 XML 定义的如本文档中所述。 AppWidgetProvider 类 定义可让您以编程方式与 widget 进行交互的基本方法。通过它您可以在更新、启用、停用或删除 widget 时接收广播。您在清单中声明 AppWidgetProvider然后实现它
主要步骤
1.声明 AppWidgetProviderInfo XML
AppWidgetProviderInfo 对象定义了 widget 的基本特性。您可以使用单个 appwidget-provider 元素在 XML 资源文件中定义 AppWidgetProviderInfo 对象并将其保存在项目的 res/xml/ 文件夹中。
具体可见以下示例
appwidget-provider xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:minWidth40dpandroid:minHeight40dpandroid:targetCellWidth1android:targetCellHeight1android:maxResizeWidth250dpandroid:maxResizeHeight120dpandroid:updatePeriodMillis86400000android:descriptionstring/example_appwidget_descriptionandroid:previewLayoutlayout/example_appwidget_previewandroid:initialLayoutlayout/example_loading_appwidgetandroid:configurecom.example.android.ExampleAppWidgetConfigurationActivityandroid:resizeModehorizontal|verticalandroid:widgetCategoryhome_screenandroid:widgetFeaturesreconfigurable|configuration_optional
/appwidget-providerwidget 大小调整属性
默认主屏幕根据已定义高度和宽度的单元格网格将 widget 放置在其窗口中。大多数主屏幕仅允许 widget 采用网格单元的整数倍的尺寸例如水平两个单元格的尺寸垂直方向为三个单元格。
借助 widget 大小调整属性您可以为 widget 指定默认尺寸并为 widget 的尺寸提供下限和上限。在此上下文中widget 的默认大小是该 widget 首次添加到主屏幕时采用的尺寸。
下表介绍了与 widget 大小调整相关的 appwidget-provider 属性
属性和说明targetCellWidth 和 targetCellHeight (Android 12)、minWidth 和 minHeight从 Android 12 开始targetCellWidth 和 targetCellHeight 属性会根据网格单元指定 widget 的默认大小。这些属性在 Android 11 及更低版本中会被忽略如果主屏幕不支持基于网格的布局则可以忽略这些属性。minWidth 和 minHeight 属性以 dp 为单位指定微件的默认大小。如果微件的最小宽度或高度的值与单元格的尺寸不匹配则这些值将向上舍入为最接近的单元格大小。我们建议您同时指定 targetCellWidth 和 targetCellHeight 以及 minWidth 和 minHeight 这两组属性这样当用户的设备不支持 targetCellWidth 和 targetCellHeight 时您的应用可以回退到使用 minWidth 和 minHeight。如果支持targetCellWidth 和 targetCellHeight 属性优先于 minWidth 和 minHeight 属性。minResizeWidth 和 minResizeHeight指定 widget 的绝对最小尺寸。这些值用于指定微件在多大程度上无法辨认或因其他原因而无法使用。使用这些属性用户可以将 widget 的大小调整为小于默认 widget 大小。如果 minResizeWidth 属性大于 minWidth 或未启用水平大小调整则系统会忽略该属性。请参阅 resizeMode。同样如果 minResizeHeight 属性大于 minHeight 或未启用垂直大小调整则会被忽略。maxResizeWidth 和 maxResizeHeight指定微件建议的大小上限。如果值不是网格单元格尺寸的倍数则将其四舍五入为最接近的单元格大小。如果 maxResizeWidth 属性小于 minWidth 或者未启用水平大小调整则会被忽略。请参阅 resizeMode。同样如果 maxResizeHeight 属性大于 minHeight 或未启用垂直大小调整则会被忽略。在 Android 12 中引入。resizeMode指定可以按什么规则调整微件的大小。您可以使用此属性让主屏幕微件在水平、垂直或两个轴上均可调整大小。用户轻触并按住某个 widget 以显示其大小调整手柄然后拖动水平或垂直手柄以更改其在布局网格上的大小。resizeMode 属性的值包括 horizontal、vertical 和 none。如需将 widget 声明为在水平和垂直方向上均可调整大小请使用 horizontal
从 Android 12 开始
使用 targetCellWidth 和 targetCellHeight 属性作为该 widget 的默认尺寸。
默认情况下微件的大小为 2x2。该 widget 可以缩小到 2x1 或最大 4x3。
Android 11 及更低版本
使用 minWidth 和 minHeight 属性计算 widget 的默认大小。
默认宽度 Math.ceil(80 / 30) 3
默认高度 Math.ceil(80 / 50) 2
默认情况下微件的大小为 3x2。该 widget 可以缩小到 2x1 或最大全屏。
其他微件属性
下表介绍了与 widget 大小调整以外的质量相关的 appwidget-provider 属性。
属性和说明updatePeriodMillis定义 widget 框架通过调用 onUpdate() 回调方法从 AppWidgetProvider 请求更新的频率。使用此值无法保证实际更新会准时进行我们建议您尽可能降低更新频率每小时不超过一次以节省电量。 如需查看选择适当更新周期的注意事项的完整列表请参阅更新微件内容的优化。initialLayout指向定义 widget 布局的布局资源。configure定义在用户添加微件时启动的 activity以便用户配置微件属性。请参阅允许用户配置 widget。 从 Android 12 开始您的应用可以跳过初始配置。如需了解详情请参阅使用微件的默认配置。description指定为您的 widget 显示的 widget 选择器的说明。在 Android 12 中引入。previewLayout (Android 12) 和 previewImageAndroid 11 及更低版本从 Android 12 开始previewLayout 属性可指定可缩放的预览并以 XML 布局形式提供该预览并将其设置为微件的默认尺寸。理想情况下指定为此属性的布局 XML 与具有真实默认值的实际 widget 具有相同的布局 XML。在 Android 11 或更低版本中previewImage 属性指定微件在配置后的外观的预览用户在选择应用微件时会看到该预览。如果未提供则用户会看到应用的启动器图标。此字段对应于 AndroidManifest.xml 文件的 receiver 元素中的 android:previewImage 属性。注意我们建议您同时指定 previewImage 和 previewLayout 属性这样一来当用户的设备不支持 previewLayout 时您的应用可以回退到使用 previewImage。如需了解详情请参阅与可缩放的 widget 预览的向后兼容性。autoAdvanceViewId指定由 widget 托管应用自动前进的 widget 子视图的视图 ID。widgetCategory声明 widget 是否可以显示在主屏幕 (home_screen) 和/或锁定屏幕 (keyguard) 上。对于 Android 5.0 及更高版本只有 home_screen 有效。widgetFeatures声明 widget 支持的功能。例如如果您希望 widget 在用户添加它时使用其默认配置请同时指定 configuration_optional 和 reconfigurable 标志。这样会绕过在用户添加 widget 后启动配置 activity。之后用户仍然可以重新配置 widget。
组件大小的调整 2.使用 AppWidgetProvider 类处理 widget 广播
AppWidgetProvider 类会处理 widget 广播并更新 widget以响应 widget 生命周期事件。以下部分介绍了如何在清单中声明 AppWidgetProvider然后实现它。
2.1 在清单中声明 widget
首先在应用的 AndroidManifest.xml 文件中声明 AppWidgetProvider 类如以下示例所示
receiver android:nameExampleAppWidgetProviderandroid:exportedfalseintent-filteraction android:nameandroid.appwidget.action.APPWIDGET_UPDATE //intent-filtermeta-data android:nameandroid.appwidget.providerandroid:resourcexml/example_appwidget_info /
/receiverreceiver 元素需要 android:name 属性该属性指定 widget 使用的 AppWidgetProvider。不得导出该组件除非需要一个单独的进程向您的 AppWidgetProvider 广播通常情况并非如此。
intent-filter 元素必须包含具有 android:name 属性的 action 元素。此属性指定 AppWidgetProvider 接受 ACTION_APPWIDGET_UPDATE 广播。这是您必须明确声明的唯一一项广播。AppWidgetManager 会根据需要自动将所有其他 widget 广播发送到 AppWidgetProvider。
meta-data 元素指定 AppWidgetProviderInfo 资源并且需要以下属性
android:name指定元数据名称。使用 android.appwidget.provider 将数据标识为 AppWidgetProviderInfo 描述符。android:resource指定 AppWidgetProviderInfo 资源位置。
2.2 实现 AppWidgetProvider 类
AppWidgetProvider 类扩展了 BroadcastReceiver 作为处理 widget 广播的便捷类。它仅接收与 widget 相关的事件广播例如当 widget 更新、删除、启用和停用时。当发生这些广播事件时系统会调用以下 AppWidgetProvider 方法 [onUpdate()](https://developer.android.com/reference/android/appwidget/AppWidgetProvider?hlzh-cn#onUpdate(android.content.Context, android.appwidget.AppWidgetManager, int[])) 调用此方法可按照 AppWidgetProviderInfo 中的 updatePeriodMillis 属性定义的间隔更新 widget。如需了解详情请参阅本页中描述其他微件属性的表。 用户添加 widget 时也会调用此方法因此它会执行基本的设置例如为 View 对象定义事件处理脚本或启动作业以加载数据以在 widget 中显示。不过如果您声明的配置 activity 不带 configuration_optional 标志则当用户添加 widget 时系统不会调用此方法但会针对后续更新调用此方法。配置 activity 应负责在配置完成后执行首次更新。如需了解详情请参阅允许用户配置应用微件。 最重要的回调是 onUpdate()。如需了解详情请参阅本页中的使用 onUpdate() 类处理事件。 [onAppWidgetOptionsChanged()](https://developer.android.com/reference/android/appwidget/AppWidgetProvider?hlzh-cn#onAppWidgetOptionsChanged(android.content.Context, android.appwidget.AppWidgetManager, int, android.os.Bundle)) 首次放置 widget 时以及每次调整 widget 大小时系统都会调用此方法。使用此回调可以根据 widget 的尺寸范围显示或隐藏内容。通过调用 getAppWidgetOptions() 获取尺寸范围并且从 Android 12 开始还可获取 widget 实例可以采用的尺寸范围列表该方法会返回包含以下内容的 BundleOPTION_APPWIDGET_MIN_WIDTH包含 widget 实例宽度的下限以 dp 为单位。OPTION_APPWIDGET_MIN_HEIGHT包含 widget 实例高度的下限以 dp 为单位。OPTION_APPWIDGET_MAX_WIDTH包含 widget 实例宽度的上限以 dp 为单位。OPTION_APPWIDGET_MAX_HEIGHT包含 widget 实例的高度上限以 dp 为单位。OPTION_APPWIDGET_SIZES包含 widget 实例可以采用的可能尺寸 (ListSizeF) 的列表以 dp 为单位。在 Android 12 中引入。 [onDeleted(Context, int[\])](https://developer.android.com/reference/android/appwidget/AppWidgetProvider?hlzh-cn#onDeleted(android.content.Context, int[])) 每次从 widget 托管应用中删除 widget 时系统都会调用此方法。 onEnabled(Context) 首次创建 widget 实例时系统会调用此方法。例如如果用户添加 widget 的两个实例则仅在第一次调用时调用此方法。如果您需要打开新数据库或执行只需要对所有 widget 实例执行一次的其他设置则非常适合执行此操作。 onDisabled(Context) 当 widget 的最后一个实例从 widget 宿主中删除时系统会调用此方法。您可以在此处清理在 onEnabled(Context) 中完成的所有工作例如删除临时数据库。 [onReceive(Context, Intent)](https://developer.android.com/reference/android/appwidget/AppWidgetProvider?hlzh-cn#onReceive(android.content.Context, android.content.Intent)) 系统会针对每个广播调用此方法它会在上述每个回调方法之前调用。您通常不需要实现此方法因为默认的 AppWidgetProvider 实现会过滤所有 widget 广播并视情况调用前面的方法。
您必须使用 AndroidManifest 中的 receiver 元素将 AppWidgetProvider 类实现声明为广播接收器。如需了解详情请参阅本页中的在清单中声明 widget。
2.2.1 使用 onUpdate() 类处理事件
最重要的 AppWidgetProvider 回调是 onUpdate()因为除非您使用不带 configuration_optional 标志的配置 activity否则在将每个 widget 添加到宿主时都会调用该回调。如果您的 widget 接受任何用户互动事件请在此回调中注册事件处理脚本。如果您的 widget 不会创建临时文件或数据库或执行其他需要清理的工作那么 onUpdate() 可能是您需要定义的唯一回调方法。
例如如果您需要一个带有按钮的 widget该按钮可在点按时启动 activity则可以使用以下 AppWidgetProvider 实现
KotlinJava
class ExampleAppWidgetProvider : AppWidgetProvider() {override fun onUpdate(context: Context,appWidgetManager: AppWidgetManager,appWidgetIds: IntArray) {// Perform this loop procedure for each widget that belongs to this// provider.appWidgetIds.forEach { appWidgetId -// Create an Intent to launch ExampleActivity.val pendingIntent: PendingIntent PendingIntent.getActivity(/* context */ context,/* requestCode */ 0,/* intent */ Intent(context, ExampleActivity::class.java),/* flags */ PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)// Get the layout for the widget and attach an onClick listener to// the button.val views: RemoteViews RemoteViews(context.packageName,R.layout.appwidget_provider_layout).apply {setOnClickPendingIntent(R.id.button, pendingIntent)}// Tell the AppWidgetManager to perform an update on the current// widget.appWidgetManager.updateAppWidget(appWidgetId, views)}}
}此 AppWidgetProvider 仅定义了 onUpdate() 方法使用该方法创建可启动 Activity 并使用 [setOnClickPendingIntent(int, PendingIntent)](https://developer.android.com/reference/android/widget/RemoteViews?hlzh-cn#setOnClickPendingIntent(int, android.app.PendingIntent)) 将其附加到微件按钮的 PendingIntent。它包含一个循环遍历 appWidgetIds 中的每个条目该循环是 ID 数组用于标识此提供程序创建的每个 widget。如果用户创建多个 widget 实例那么这些实例将全部同时更新。但是只能为微件的所有实例管理一个 updatePeriodMillis 时间表。例如如果将更新时间表定义为每两小时更新一次并且在第一个实例一小时后添加了该 widget 的第二个实例那么这两个实例都会根据第一个更新周期定义的更新周期进行更新而忽略第二个更新周期。两者每两小时更新一次而不是每小时更新一次。
接收 widget 广播 intent
AppWidgetProvider 是一个便捷类。如果您想直接接收 widget 广播可以实现自己的 BroadcastReceiver 或替换 [onReceive(Context,Intent)](https://developer.android.com/reference/android/appwidget/AppWidgetProvider?hlzh-cn#onReceive(android.content.Context, android.content.Intent)) 回调。您需要关注的 intent 如下
ACTION_APPWIDGET_UPDATEACTION_APPWIDGET_DELETEDACTION_APPWIDGET_ENABLEDACTION_APPWIDGET_DISABLEDACTION_APPWIDGET_OPTIONS_CHANGED
2.3 创建 widget 布局
您必须在 XML 中定义 widget 的初始布局并将其保存在项目的 res/layout/ 目录中。
如果您熟悉布局那么创建 widget 布局将非常简单。但请注意widget 布局基于 RemoteViews并不支持所有类型的布局或视图 widget。您无法使用自定义视图或 RemoteViews 支持的视图子类。
RemoteViews 还支持 ViewStub这是一种不可见、零大小的 View可用于在运行时延迟膨胀布局资源。
以下代码示例展示了如何实现这些组件。
// Check
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true);// 点击单选框
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2);// 监听选择响应
remoteView.setOnCheckedChangeResponse(R.id.my_checkbox,RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent));在 res/layout-v31 中提供两个布局一个以搭载 Android 12 或更高版本的设备为目标平台另一个以旧版 Android 11 或更低版本在默认的 res/layout 文件夹中提供。
支持的部分view 比如说EditText组件就不支持然后外面通过代码创建的 RemoteView 就会报错。会有错误提示的一般都是不支持xxx的view。
示例
1.声明AppWidgetProviderInfo XML
appwidget-provider xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:initialLayoutlayout/desktop_layoutandroid:minWidth110dpandroid:minHeight40dpandroid:previewImagemipmap/ic_launcher_roundandroid:updatePeriodMillis8640000android:widgetCategoryhome_screen|keyguard/appwidget-provider2.使用 AppWidgetProvider 类处理 widget 广播
receiverandroid:name.desktop.DeskTopWidgetandroid:exportedtrueintent-filteraction android:nameandroid.appwidget.action.APPWIDGET_UPDATE //intent-filtermeta-dataandroid:nameandroid.appwidget.providerandroid:resourcexml/appwidget_info /
/receiver3.实现 AppWidgetProvider 类
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.util.Log
import android.widget.RemoteViews
import com.example.zanglidemo.MainActivity
import com.example.zanglidemo.Rclass DeskTopWidget : AppWidgetProvider() {var TAG MyWidgetoverride fun onReceive(context: Context?, intent: Intent?) {super.onReceive(context, intent)Log.i(TAG, 接受广播)}/*** 第一个widget被添加调用** param context*/override fun onEnabled(context: Context) {super.onEnabled(context)Log.i(TAG, widget onEnabled 状态)}/*** widget被添加 || 更新时调用** param context*/override fun onUpdate(context: Context,appWidgetManager: AppWidgetManager?,appWidgetIds: IntArray?) {super.onUpdate(context, appWidgetManager, appWidgetIds)Log.i(TAG, widget onUpdate 状态)// 构建布局的 RemoteViews 对象// 定义布局文件 R.layout.widget_layoutval intent PendingIntent.getActivity(context,0,Intent(context, MainActivity::class.java).apply {putExtra(type, 0)},PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)val intent11 PendingIntent.getActivity(context,1,Intent(context, MainActivity::class.java).apply {putExtra(type, 1)putExtra(name, 观音心咒)},PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)val intent12 PendingIntent.getActivity(context,2,Intent(context, MainActivity::class.java).apply {putExtra(type, 1)putExtra(name, 百字明)},PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)val intent13 PendingIntent.getActivity(context,3,Intent(context, MainActivity::class.java).apply {putExtra(type, 1)putExtra(name, 顶礼)},PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)val intent21 PendingIntent.getActivity(context,4,Intent(context, MainActivity::class.java).apply {putExtra(type, 2)putExtra(name, 早)},PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)val intent22 PendingIntent.getActivity(context,5,Intent(context, MainActivity::class.java).apply {putExtra(type, 2)putExtra(name, 晚)},PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)// 更新内容val remoteViews: RemoteViews RemoteViews(context.packageName ?: , R.layout.desktop_layout).apply {setOnClickPendingIntent(R.id.desk_bg, intent)setOnClickPendingIntent(R.id.desk_title, intent)setOnClickPendingIntent(R.id.desk_vf1, intent11)setOnClickPendingIntent(R.id.desk_vf2, intent12)setOnClickPendingIntent(R.id.desk_vf3, intent13)setOnClickPendingIntent(R.id.desk_fast_morn, intent21)setOnClickPendingIntent(R.id.desk_fast_even, intent22)}// 更新小组件 UIappWidgetManager?.updateAppWidget(appWidgetIds, remoteViews)}/*** 最后一个widget被删除时调用** param context*/override fun onDisabled(context: Context) {super.onDisabled(context)Log.i(TAG, widget onDisabled 状态)}
}4. widget 布局
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:idid/desk_bgandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:backgrounddrawable/bg_veryandroid:backgroundTintcolor/whiteandroid:orientationverticalandroid:padding5dpLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:orientationhorizontalTextViewandroid:idid/desk_titleandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginBottom5dpandroid:drawableLeftdrawable/heart_24dpandroid:drawablePadding2dpandroid:drawableTintcolor/redandroid:gravitycenterandroid:text修行android:textColorcolor/grayandroid:textSize18spandroid:textStylebold /TextViewandroid:idid/desk_fast_mornandroid:layout_width30dpandroid:layout_height30dpandroid:layout_marginLeft5dpandroid:backgrounddrawable/bg_circleandroid:backgroundTintcolor/blueandroid:gravitycenterandroid:text早android:textColorcolor/white /TextViewandroid:idid/desk_fast_evenandroid:layout_width30dpandroid:layout_height30dpandroid:layout_marginLeft5dpandroid:backgrounddrawable/bg_circleandroid:backgroundTintcolor/spring_greenandroid:gravitycenterandroid:text晚android:textColorcolor/white //LinearLayoutViewFlipperandroid:idid/desk_vfandroid:layout_width140dpandroid:layout_height35dpandroid:layout_marginTop10dpandroid:autoStarttrueandroid:backgrounddrawable/bg_veryandroid:backgroundTintcolor/greenyellowandroid:inAnimationanim/anim_inandroid:outAnimationanim/anim_outTextViewandroid:idid/desk_vf1android:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:gravitycenter_vertical|centerandroid:text观音心咒android:textColorcolor/grayandroid:textSize18spandroid:textStylebold /TextViewandroid:idid/desk_vf2android:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:gravitycenter_vertical|centerandroid:textbzmandroid:textColorcolor/grayandroid:textSize18spandroid:textStylebold /TextViewandroid:idid/desk_vf3android:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:gravitycenter_vertical|centerandroid:text顶礼android:textColorcolor/grayandroid:textSize18spandroid:textStylebold //ViewFlipper/LinearLayout5.activity中的处理
fun onHandlePendingIntent() {Log.e(TAG, onHandlePendingIntent:type ${intent.getStringExtra(type)})Log.e(TAG, onHandlePendingIntent:name ${intent.getStringExtra(name)})when (intent.getStringExtra(type)) {0 - {Log.i(TAG, onActivityResult: 打开界面0)//do nothing}1, 2 - {Log.i(TAG, onActivityResult: 打开界面1、2)Handler(Looper.getMainLooper()).postDelayed({//同样也需要延迟}, 500)}}}这里最好延迟处理一下否则容易出问题
6.允许用户固定 widget
在搭载 Android 8.0API 级别 26及更高版本的设备上允许用户创建固定快捷方式的启动器还可让用户将 widget 固定到主屏幕上。与固定快捷方式类似这些固定的 widget 让用户能够访问应用中的特定任务并且可以直接从应用添加到主屏幕
val appWidgetManager AppWidgetManager.getInstance(context)
val myProvider ComponentName(requireContext(), DeskTopWidget::class.java)if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) {if (appWidgetManager.isRequestPinAppWidgetSupported()){val successCallback PendingIntent.getBroadcast(/* context */ context,/* requestCode */ 0,/* intent */ Intent(),/* flags */ PendingIntent.FLAG_UPDATE_CURRENT)appWidgetManager.requestPinAppWidget(myProvider, null, successCallback)}
}注意 如果您的应用不需要接收系统是否成功将 widget 固定到受支持的启动器上的通知您可以将 null 作为 requestPinAppWidget() 的第三个参数传入。
参考链接
官方文档
如何开发自己的 AppWidget 小组件程序构建应用微件
如何开发「托管 AppWidget 小组件」的宿主应用(类似于手机桌面 Launcher 应用)构建应用微件托管应用
如何设置 AppWidget 小组件的最小尺寸应用微件设计指南
Android 小组件 AppWidgetProvider
Android 桌面小组件 AppWidgetProvider