如何将上下文发送到 BroadcastReceiver?

How to send context to BroadcastReceiver?

我想使用我的 BroadcastReceiver 作为数据发送到我的 activity。出于这个原因,我使用 LocalBroadcastManager。该管理器用于注册和取消注册我的接收器。问题是 onReceive 方法中的 ContextonStartonStop 方法中的 Context 不同。

我需要将 activity 上下文传递到我的 BroadcastReceiver 或在 Activity 中初始化的 LocalBroadcastManager 实例。因为我的接收器没有收到任何数据。

也许这不是这个管理器上下文的错,但我不知道为什么自从我实现了这个管理器后它就不起作用了。

class GPSReceiver: BroadcastReceiver(){

    companion object{
        const val GPS_PAYLOAD = "gps_payload"
    }

    override fun onReceive(context: Context, intent: Intent) {
        try {
            val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
            val int = Intent(GPS_PAYLOAD)
            if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                int.putExtra(GPS_PAYLOAD, true)
            } else {
                int.putExtra(GPS_PAYLOAD, false)
            }
            LocalBroadcastManager.getInstance(context).sendBroadcast(int)
        } catch (ex: Exception) {

        }
    }
}

正在Activity内注册接收器:

private val gpsStatusReceiver = object: BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            App.log("isGpsEnabled: onReceive")
            val gpsStatus = intent?.extras?.getBoolean(GPS_PAYLOAD)
            if (gpsStatus != null) {
                if (gpsStatus){
                    App.log("isGpsEnabled: true")
                    hideGpsSnackbar()
                } else {
                    App.log("isGpsEnabled: false")
                    showGpsSnackbar()
                }
            } else {
                App.log("isGpsEnabled: null")
            }
        }
    }

override fun onStart() {
        super.onStart()
        LocalBroadcastManager.getInstance(this).apply {
            val filter = IntentFilter()
            filter.apply {
                addAction("android.location.PROVIDERS_CHANGED")
                addAction(GPS_PAYLOAD)
            }
            registerReceiver(gpsStatusReceiver, filter)
        }
    }

我看过你的代码。因此,上下文没有问题,但方法存在问题。 您正在使用与在 Reciever 中获取数据的字符串相同的字符串注册您的 Reciever。 所以从 Fragment/Activity

发送你的广播

点赞发送广播

private fun sendSuccessfulCheckoutEvent() {
        val intent = Intent("successful_checkout_event")
        intent.putExtra("cartID", cartId)
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
    }

然后像这样在 Activity/Fragment 中收听

1) 创建广播接收器

private val checkoutDoneReciever : BroadcastReceiver = object : BroadcastReceiver(){
        override fun onReceive(context: Context?, intent: Intent?) {
             val cartNumbers = intent.getIntExtra("cartID", 0)
              Log.d("receiver", "Got message: $cartNumbers.toString()")
        }
    }

2) 在onCreate()/onStart()中注册

LocalBroadcastManager.getInstance(this).registerReceiver(cartUpdatedReceiver,IntentFilter("successful_checkout_event"))

3) 在onDestroy()

中取消注册
LocalBroadcastManager.getInstance(this).unregisterReceiver(cartUpdatedReceiver)