如何将上下文发送到 BroadcastReceiver?
How to send context to BroadcastReceiver?
我想使用我的 BroadcastReceiver 作为数据发送到我的 activity。出于这个原因,我使用 LocalBroadcastManager
。该管理器用于注册和取消注册我的接收器。问题是 onReceive
方法中的 Context
与 onStart
和 onStop
方法中的 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)
我想使用我的 BroadcastReceiver 作为数据发送到我的 activity。出于这个原因,我使用 LocalBroadcastManager
。该管理器用于注册和取消注册我的接收器。问题是 onReceive
方法中的 Context
与 onStart
和 onStop
方法中的 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)