Android 在扩展NotificationListenerService的类中注册接收方

Android 在扩展NotificationListenerService的类中注册接收方,android,Android,我试图更好地理解NotificationListenerService。我已经创建了一个监听通知的NotificationListenerService(到目前为止还不错) 我的理解是,该服务将绑定到系统服务,基本上它将一直在后台运行,当然,它的方法将仅在通知发生更改时被调用。 因此,我认为我将是“聪明的”,因为我们不能再在清单文件中使用隐式意图过滤器,我想我将在这里注册我的过滤器,类似于: static PlayBackQue playbackQue=new PlayBackQue(); ..

我试图更好地理解
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
的确切生命周期

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


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

NotificationListenerService生命周期以onListenerConnected()开始,以onListenerDisconnected()结束。它应该是安全的注册您的接收器时,连接和取消注册时,断开连接。我对PlayBackQue接收器了解不多,但使用静态变量通常不是一个好主意。最好将其作为服务的实例变量。当您的服务连接时,您可以假设系统将保留对它的引用。一旦断开连接,就不能对此进行任何假设,也不希望有任何静态变量挂起。除非你需要那个接收者留下,否则它可能不属于NotificationListenerService。

最安全的做法是 -在通知侦听器服务的onCreate()函数中调用registerReceiver() -在NotificationListenerService的onDestroy()函数中调用unregisterReceived()


我在过去做过这件事,这个应用程序没有任何漏洞

谢谢,PlayBackQue是我自己的类,我知道onListenerConnected()和onListenerDisconnected(),onListenerDisconnected()从未被调用,但是onDestory()确实被调用,在这一点上,我确实看到日志对此表示不满。您正在向应用程序授予通知访问权限,对吗?只要你这样做,它就会连接起来。撤销通知访问时,服务将断开连接。奇怪的是,在没有首先断开连接的情况下调用onDestroy()。它曾经连接过吗?是的,它确实连接过,而且工作非常好。它从不断开连接(除非我删除了通知访问权限),所以我确实觉得调用onDestory很奇怪,因此在这里询问……Raju,谢谢,但如果您阅读了关于NotificationListenerService类的问题。我知道如何正常地做,但是notificationlistener是一个特例,onDestory甚至不应该在一开始就被调用,或者至少这是我试图解决的问题。