You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android使用Intent.createChooser监听分享时BroadcastReceiver收不到广播怎么办

问题核心原因

  • PendingIntent使用了FLAG_IMMUTABLE不可变标记,系统需要向PendingIntent携带的Intent中写入用户选中的分享组件信息,不可变属性会阻止这一操作,导致回调无法触发。
  • Intent.createChooser的第一个参数传入了空Intent,导致系统分享选择器的回调逻辑未被正确激活。

修复步骤

  1. 修改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均已达标可直接使用

  1. 修改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)
  1. (可选)补充广播接收时的组件信息读取逻辑
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")
        }
    }
}
  1. 补充广播反注册逻辑避免内存泄漏,在Fragment的onDestroyView生命周期中添加:
override fun onDestroyView() {
    super.onDestroyView()
    requireActivity().unregisterReceiver(receiver)
}

内容的提问来源于stack exchange,提问作者Miltent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:24:03