Android开发调用requestPinAppWidget传Bundle 配置Activity取参为空如何解决
问题原因
调用AppWidgetManager.requestPinAppWidget()时传入的自定义参数Bundle,不会直接挂载到配置Activity启动Intent的根extras下。系统会将你传入的这个Bundle统一封装在固定key AppWidgetManager.EXTRA_APPWIDGET_OPTIONS 对应的子Bundle中,直接调用intent?.extras?.getString("id")读取根extras,自然拿不到传入的id值。
另外注意:方法第三个参数传入的pendingIntent是小组件固定成功后的系统回调意图,和配置Activity的启动参数没有关联,不要混淆两个意图的作用。
正确调整方式
- 配置Activity中读取参数的逻辑替换为如下写法,先取出系统封装的options Bundle,再读自定义参数:
// 取出系统存放小组件配置参数的Bundle val widgetOptions = intent?.getBundleExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS) // 读取自定义传入的id val targetId = widgetOptions?.getString("id")
- 做好场景兼容:如果支持用户手动从小组件列表拖拽添加的场景,这种启动方式下options里不会有你提前传入的自定义id,需要做好空值兜底,等系统给小组件分配正式的
appWidgetId后,再完成业务id和小组件id的关联。 - 持久化兜底:不要把核心业务参数只依赖该Bundle传递,小组件添加成功后,要把业务id和系统分配的
appWidgetId做本地持久化映射(可存在SharedPreferences、本地数据库中),后续小组件更新、设备重启后,直接通过appWidgetId查询映射拿到业务参数,避免参数丢失。
内容的提问来源于stack exchange,提问作者Pavel Poley
相关产品推荐
相关产品推荐

