Android 桌面添加Widget后消失多API版本可复现问题求助
问题根源
核心错误来自widget_info.xml中的android:configure属性配置错误:android:configure属性的作用是指定用户添加Widget时需要先启动的配置Activity,当前配置的值是mAppWidgetProvider(广播接收器类),不属于合法的Activity路径。系统尝试启动不存在的配置Activity失败后,会直接终止Widget添加流程,导致Widget添加后立刻消失。
修复方案
1. 移除错误的configure属性(无配置页场景)
如果你的Widget不需要添加前的配置步骤,直接删除widget_info.xml里的android:configure="com.app24.test.mAppWidgetProvider"一行即可,修改后的示例如下:
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/my_widget" android:minWidth="250dp" android:minHeight="70dp" android:resizeMode="horizontal|vertical" android:updatePeriodMillis="10000" android:widgetCategory="home_screen"> </appwidget-provider>
2. 补充Widget更新逻辑
当前mAppWidgetProvider为空实现,需要至少重写onUpdate方法完成Widget的初始渲染,避免系统渲染异常:
import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.widget.RemoteViews; public class mAppWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // 遍历所有已添加的当前Widget实例 for (int appWidgetId : appWidgetIds) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget); // 可在此处添加按钮点击事件等自定义逻辑 appWidgetManager.updateAppWidget(appWidgetId, views); } } }
3. 高版本系统适配
Android 12(API 31)及以上版本要求Widget接收器显式声明android:exported属性,否则会被系统拦截,需要修改Manifest中的接收器配置:
<receiver android:name=".mAppWidgetProvider" android:exported="true"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"/> </receiver>
4. 带配置页场景的特殊处理
如果确实需要Widget添加前的配置步骤,需要单独新建配置Activity,在Manifest中完成注册,再将android:configure属性值替换为该Activity的完整路径。配置Activity结束时必须返回携带Widget ID的结果,否则Widget仍会添加失败。
内容的提问来源于stack exchange,提问作者Ahmed Al-Ghanim
相关产品推荐
相关产品推荐

