Android发广播的坑

张开发
2026/4/12 17:11:29 15 分钟阅读

分享文章

Android发广播的坑
示例代码如下classMainActivity:AppCompatActivity(){valreceiverobject:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent?){Log.i(MainActivity,onReceive)}}valactioncn.android666.logback.android.demo.actionoverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewByIdButton(R.id.button).setOnClickListener{valintentIntent(action).setPackage(packageName)sendBroadcast(intent)}ContextCompat.registerReceiver(this,receiver,IntentFilter(action),ContextCompat.RECEIVER_NOT_EXPORTED)}overridefunonDestroy(){super.onDestroy()unregisterReceiver(receiver)Log.i(MainActivity,onDestroy)}}在公司的一台天龙品牌的Android手机上型号是N630Android 11系统运行如上代码非常简单就是注册广播然后发送广播使用了最新广播代码RECEIVER_NOT_EXPORTED指示这个广播不会导出也就是别的应用发广播我们是收不到的在调用发广播时我们调用了setPackage(packageName)则表明这个广播只会发给自己的应用别的应用不会收到。注即使使用旧的注册广播和发广播的方式也会有下面说的Bug当第一次从Android Studio运行App时发送广播正常然后再点Android Studio的运行按钮此时再发广播就收不到了奇怪的很在个复杂的项目你会以为是项目哪里有问题现在我把代码简化就只有注册广播和发广播的代码了所以这明显是系统有问题。经过测试发现当我在手机中杀进程后再从桌面启动App或者直接从Android Studio点运行此时都能正常收到广播。这神奇的很同样的代码我在另一个品牌征服H30的手机同样是 Android 11 系统 同样的操作一切正常。后来问了AI说是广播没有正常解除注册导致的于是我试验了在onDestroy时解除广播然后再从Android Studio运行也能正常收到广播了但是这也算是系统有问题因为我们开发经常会直接就从Android Studio运行新的代码而不是先在手机上操作正常退出了才从Android Studio中运行。另外我还发现在那台有问题的手机上无论当前App是可以收到广播还是不能收到广播的状态我点击Android studio运行旁边的停止按钮如下然后再点运行按钮也是无法正常收到广播的这个停止按钮有时候有显示有时候没显示我也搞不懂。或者点击进程列表中的Force stop process按钮需要先选择好进程如下然后再从桌面启动App或者在Android Studio重新运行App也是无法收到广播的。在App可以正常收到广播的状态下当我点击进程列表中的Kill process按钮时如下再从桌面启动App或者在Android Studio重新运行App此时是可以正常收到广播的但是如果App处于收不到广播的状态下点这个按钮杀进程然后再启动App也是收不到广播的。但是如果是在手机上调出最近任务并在此界面中杀掉应用进程则再从桌面启动App或者在Android Studio重新运行App则可以正常收到广播。所以总结就是在手机上手动杀进程可以确保系统把App的旧广播移除这样再启动时可以正常收到广播。一但感觉广播接收不正常、收不到则手动杀进程后再重试。甚至也可以卸载应用重装但这比较麻烦。我还找到另外一个解决方案当发广播收不到后调用unregisterReceiver(receiver)然后finish掉这个Activity然后再启动这个Activity然后再注册广播再发送广播就又正常了。我是基于我的只有一个Activity的简单应用实验的如果有多个Activity或者更复杂的项目不知道还有没有用当发广播收不到后不调用unregisterReceiver(receiver)直接finish掉这个Activity然后再启动这个Activity然后再注册广播此时我发现每次发广播会收到两次。总结还是手动杀进程比较好不会导致发一次广播而收到两次的问题。

更多文章