首页 > 解决方案 > 在扩展 NotificationListenerService 的类中注册接收器

问题描述

我试图NotificationListenerService更好地理解它。我创建了一个NotificationListenerService监听通知(到目前为止一切顺利)。

我的理解是这个服务会绑定到系统服务上,基本上它会一直在后台运行,当然它的方法只有在通知发生变化时才会被调用。所以我认为我会“聪明”,因为我们不能再在清单文件中使用隐式意图过滤器,我虽然我会在这里注册我的过滤器,比如:

static PlayBackQue playbackQue=new PlayBackQue();
.................................................
IntentFilter filter = new IntentFilter ();
filter.addAction ("android.app.action.ENTER_CAR_MODE");
filter.addAction ("android.app.action.EXIT_CAR_MODE");
registerReceiver(playbackQue,filter);

但是我确实看到NotificationListenerService实际上确实调用了该onDestory方法并且日志抱怨泄漏(因为我实际上并没有取消注册侦听器)。

我的接收器继续正常工作,但我确信这并不好。

我很难完全理解的是NotificationListenerService.

此外,如果系统服务持有对我的扩展类的引用,NotificationListenerService假设它也将持有静态变量的引用是否安全,在这种情况下我的广播接收器会被记住?

我知道我可以(也许应该)创建一个前台服务,但是我的应用程序无论如何都需要访问通知,所以我希望避免运行另一个前台服务,只是为了实现 2 个意图过滤器。遗憾的是,谷歌已经从隐式过滤器列表中删除了 CAR 模式过滤器,目前还没有真正的方法来检测手机何时处于汽车模式。Job Scheduler 不是一个真正的选择,因为它不能保证立即运行,并且无论如何也没有合适的时间表可以使用......

标签: android

解决方案


NotificationListenerService 生命周期以 onListenerConnected() 开始,以 onListenerDisconnected() 结束。在连接时注册您的接收器并在断开连接时取消注册它应该是安全的。我对 PlayBackQue 接收器了解不多,但使用静态变量通常不是一个好主意。最好让它成为服务的实例变量。当您的服务已连接时,您可以假设系统将保留对它的引用。一旦断开连接,您就无法对此做出任何假设,并且您不希望有任何静态变量存在。除非您需要该接收器继续存在,否则它可能不属于 NotificationListenerService。


推荐阅读