Android使用Intent.createChooser监听分享时BroadcastReceiver收不到广播怎么办
问题核心原因
- PendingIntent使用了
FLAG_IMMUTABLE不可变标记,系统需要向PendingIntent携带的Intent中写入用户选中的分享组件信息,不可变属性会阻止这一操作,导致回调无法触发。 Intent.createChooser的第一个参数传入了空Intent,导致系统分享选择器的回调逻辑未被正确激活。
修复步骤
- 修改PendingIntent的标记,将
FLAG_IMMUTABLE替换为FLAG_MUTABLE
val pi = PendingIntent.getBroadcast( context, 0, Intent(INTENT_RECEIVER_ACTION), PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE )
如果你的项目compileSdk版本低于31,可以添加版本判断兼容低版本,当前主流项目compileSdk均已达标可直接使用
- 修改createChooser的第一个参数,传入合法的基础分享Intent,不要传空Intent
// 构造符合分享类型的基础Intent val baseShareIntent = Intent(Intent.ACTION_SEND).apply { type = "text/plain" } val openInChooser = Intent.createChooser(baseShareIntent, context.getString(R.string.share_via), pi.intentSender)
- (可选)补充广播接收时的组件信息读取逻辑
private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val chosenComponent = intent.getParcelableExtra<ComponentName>(Intent.EXTRA_CHOSEN_COMPONENT) chosenComponent?.run { Log.d("xdd received", "选中的分享应用包名:$packageName") } } }
- 补充广播反注册逻辑避免内存泄漏,在Fragment的
onDestroyView生命周期中添加:
override fun onDestroyView() { super.onDestroyView() requireActivity().unregisterReceiver(receiver) }
内容的提问来源于stack exchange,提问作者Miltent
相关产品推荐
相关产品推荐

