Android 14中RECEIVER_NOT_EXPORTED本地广播接收器无法接收广播问题
Android 14中RECEIVER_NOT_EXPORTED接收器无法接收广播的解决方案
问题出在你发送广播的方式上:你发送的是无包名限制的隐式全局广播,而Android 14对RECEIVER_NOT_EXPORTED类型的接收器有严格限制——这类接收器仅允许接收本应用内部的广播,无法接收未指定目标应用的隐式全局广播。
解决方法
方法1:发送广播时指定本应用包名
修改发送广播的代码,给Intent添加当前应用的包名,确保广播仅发送给本应用内的接收器:
binding.button.setOnClickListener { Intent("com.nama.action").also { intent -> intent.putExtra("nama", dashboardViewModel.text.value) // 指定当前应用包名,限定广播接收范围 intent.setPackage(requireContext().packageName) requireContext().sendBroadcast(intent) } }
方法2:使用显式Intent指定接收器(适用于明确知道接收器类的场景)
直接通过接收器类创建Intent,让广播精准指向目标接收器:
binding.button.setOnClickListener { Intent(requireContext(), MyBroadcastReceiver::class.java).also { intent -> intent.action = "com.nama.action" intent.putExtra("nama", dashboardViewModel.text.value) requireContext().sendBroadcast(intent) } }
额外注意事项
你的代码存在内存泄漏风险:动态注册的广播接收器未在Fragment销毁时注销。需要将接收器改为Fragment成员变量,并在onDestroyView中注销:
class DashboardFragment : Fragment() { private var _binding: FragmentDashboardBinding? = null private val binding get() = _binding!! // 声明为成员变量 private lateinit var br: BroadcastReceiver override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { // ... 其他代码 ... // 初始化接收器并注册 br = MyBroadcastReceiver() val filter = IntentFilter("com.nama.action") ContextCompat.registerReceiver(requireContext().applicationContext, br, filter, ContextCompat.RECEIVER_NOT_EXPORTED) return root } override fun onDestroyView() { super.onDestroyView() // 注销接收器 ContextCompat.unregisterReceiver(requireContext().applicationContext, br) _binding = null } }
内容的提问来源于stack exchange,提问作者Srikanth Nama
相关产品推荐
相关产品推荐

