我有一个扩展View的自定义类。在那个课程中,我想基于广播做一些事情,所以我注册了一个BroadcastReceiver。 什么时候是为自定义 View 实现注册和取消注册 BroadcastReceiver 的最佳时间?对我来说,它似乎不像 Activity 那样简单。
当我现在做的事情是压倒一切的
onWindowVisibilityChanged()
。在那里,我检查提供的 int visibility
,如果是 VISIBLE
,我就注册。不然我就注销了我现在意识到这是有问题的,因为onWindowVisibilityChanged()
这么说,
请注意,这会告诉您窗口管理器是否可见您的窗口;这并不能告诉您您的窗口是否被屏幕上的其他窗口遮挡,即使它本身是可见的。
如果我的视图不可见,我不希望我的广播接收器接收广播。虽然,我现在知道它可以被标记为
VISIBLE
但屏幕上的其他东西可能在它前面。所以,这并不可靠。
您必须使自定义视图 Activity/Fragment 生命周期感知,即您必须通知它 onResume()/onPause() 发生(或分别发生其他对)并注册/取消注册。我想没有更好的办法了
private val myReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// Handle the broadcast
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
// Register the receiver
val intentFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED) // Example filter
context.registerReceiver(myReceiver, intentFilter)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
// Unregister the receiver to prevent memory leaks
context.unregisterReceiver(myReceiver)
}