Android 7(API25)跨应用发送APPWIDGET_UPDATE广播权限问题求助
解决Android 7.0+发送APPWIDGET_UPDATE广播被禁止的问题
这个问题我太熟了!Android 7.0(API 24及以上)引入了后台执行限制,其中就包括对大部分隐式广播的拦截,你遇到的报错就是因为这个规则导致的。API 19没有这个限制,所以之前能正常运行,到API 25就触发了系统的安全拦截。
先纠正你一个小错误:你之前在<activity>标签里加APPWIDGET_UPDATE的intent-filter是没用的,Widget的广播接收器应该注册为<receiver>组件,不是Activity。下面是具体的解决方案:
1. 改用显式广播发送(核心解决方法)
Android 7.0+允许发送显式广播(明确指定目标组件的广播),所以你需要修改发送广播的代码,直接指定Widget Provider的组件信息,而不是用隐式Intent。
示例代码如下:
// 1. 创建更新广播的Intent Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); // 2. 指定目标Widget的组件名(替换成你的Widget类全路径和目标包名) ComponentName widgetComponent = new ComponentName( "com.app.package.balance", // 目标Widget所在的包名 "com.app.package.balance.YourWidgetProviderClass" // 你的WidgetProvider类的全路径 ); updateIntent.setComponent(widgetComponent); // 3. (可选)如果需要更新特定的Widget实例,添加Widget ID数组 int[] targetWidgetIds = AppWidgetManager.getInstance(context) .getAppWidgetIds(widgetComponent); updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, targetWidgetIds); // 4. 发送广播 context.sendBroadcast(updateIntent);
2. 确保Manifest中Widget的正确注册
把你之前加在Activity里的intent-filter移到Widget的<receiver>标签下,这才是正确的Widget注册方式:
<application ...> <!-- 正确的Widget Provider注册 --> <receiver android:name="com.app.package.balance.YourWidgetProviderClass"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <!-- 关联Widget的配置信息XML,替换成你的文件路径 --> <meta-data android:name="android.appwidget.provider" android:resource="@xml/your_widget_config_info"/> </receiver> <!-- 你的其他Activity等组件... --> </application>
为什么之前的方法没用?
- Android 7.0+禁止发送未指定目标组件的隐式广播,
APPWIDGET_UPDATE属于被限制的范畴; - 你错误地在Activity中配置了intent-filter,但Widget的广播接收器是
receiver组件,Activity无法接收这个广播,所以配置无效。
按照上面的步骤修改后,跨应用发送Widget更新广播就能在API 25及以上正常运行了。
内容的提问来源于stack exchange,提问作者Churkin Anton
相关产品推荐
相关产品推荐

