android - 在扩展 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 不是一个真正的选择,因为它不能保证立即运行,并且无论如何也没有合适的时间表可以使用......
解决方案
NotificationListenerService 生命周期以 onListenerConnected() 开始,以 onListenerDisconnected() 结束。在连接时注册您的接收器并在断开连接时取消注册它应该是安全的。我对 PlayBackQue 接收器了解不多,但使用静态变量通常不是一个好主意。最好让它成为服务的实例变量。当您的服务已连接时,您可以假设系统将保留对它的引用。一旦断开连接,您就无法对此做出任何假设,并且您不希望有任何静态变量存在。除非您需要该接收器继续存在,否则它可能不属于 NotificationListenerService。
推荐阅读
- css - 在 Angular 9 应用程序的组件中模拟移动分辨率(或移动视图)
- css - 文本换行不适用于包装内的标签 - CSS
- visual-studio-code - VisualSudio 在 .scss 中搜索 .css 类
- spring-boot - @DataJpaTest 在 MySQL 的情况下更新实际数据,但在 H2 上工作正常
- perforce - 如何在 p4ignore 中允许文件
- c# - 从 HttpContext 获取 ObjectResult 值
- azure-devops - 如何调用具有变量和运行时参数的 YAML 管道?
- android - 现有文档的 Firestore 设置 ID
- php - 使用 AJAX 在数据库中查找用户名
- html - Pattern 属性在 HTML 表单中根本不起作用