Android 何时为自定义视图类注册/取消注册广播接收器?
我有一个扩展的自定义类。在那门课上,我想做一些基于广播的事情,所以我注册了一个何时是注册和取消注册自定义视图实现的BroadcastReceiver的最佳时间?对我来说,这似乎不像一项活动那么简单 我现在所做的是覆盖Android 何时为自定义视图类注册/取消注册广播接收器?,android,broadcastreceiver,android-view,Android,Broadcastreceiver,Android View,我有一个扩展的自定义类。在那门课上,我想做一些基于广播的事情,所以我注册了一个何时是注册和取消注册自定义视图实现的BroadcastReceiver的最佳时间?对我来说,这似乎不像一项活动那么简单 我现在所做的是覆盖onWindowVisibilityChanged()。在那里,我检查提供的int可见性,如果它是可见的I寄存器。否则,我将取消注册。我现在意识到这是有问题的,因为onWindowVisibilityChanged()这样说 请注意,这会告诉您窗口是否对窗口管理器可见;这不会告诉您您
onWindowVisibilityChanged()
。在那里,我检查提供的int可见性
,如果它是可见的
I寄存器。否则,我将取消注册。我现在意识到这是有问题的,因为onWindowVisibilityChanged()
这样说
请注意,这会告诉您窗口是否对窗口管理器可见;这不会告诉您您的窗口是否被屏幕上的其他窗口遮挡,即使它本身是可见的
如果我的视图不可见,我不希望我的广播接收器接收广播。虽然,我现在知道它可以标记为可见,但是屏幕上的其他东西可能在它前面。因此,这是不可靠的。您必须让您的自定义视图活动/片段生命周期意识到,即您必须通知它onResume()/onPause()已发生(或分别发生了其他对),并注册/取消注册。我认为没有更好的方法了。“在那个课程中,我想做一些基于广播的事情,所以我注册了一个广播接收器”——FWIW,我认为这是一个架构缺陷。对我来说,一个自定义的
视图
收听广播就像一个按钮
读取文件或编辑文本
通过HTTP与Web服务器通信。通过广播、文件I/O、网络I/O等进行通信不属于视图层,而是属于其他地方(例如,MVC风格体系结构中的控制器)。@Commonware我并不完全同意你的观点。为了更好地解释,视图所做的一件事就是显示某些内容的下载进度。接收广播是为了知道如何增加视图下载的进度条。“接收广播是为了知道如何增加视图下载的进度条”-IMHO,广播本身应由控制器(活动、片段等)处理,然后控制器调用相关视图上的方法。