Android Compose中NotificationListenerService.onNotificationPosted未触发排查
解决NotificationListenerService.onNotificationPosted未调用的问题
必须引导用户手动开启通知监听权限
通知监听权限不属于普通运行时权限,无法通过代码直接申请,必须让用户跳转到系统的「通知访问」设置页面为你的应用开启权限。哪怕你启动了服务,没有这个权限系统也不会把通知推送给你的服务。
跳转设置页的代码示例:val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS") startActivity(intent)用户开启权限后,系统才会真正绑定你的
NotificationListenerService,onNotificationPosted方法才会被触发。检查AndroidManifest.xml的服务声明是否正确
确保服务配置包含必填的权限和Intent Filter,缺一不可:<service android:name=".MyNotificationListenerService" android:exported="true" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>注意:
android:permission必须严格写为android.permission.BIND_NOTIFICATION_LISTENER_SERVICE,Intent Filter的Action也不能写错,android:exported="true"是系统绑定服务的必要条件。避免系统后台限制影响服务运行
部分国产安卓厂商(小米、华为、OPPO等)有严格的后台管理策略,可能会限制NotificationListenerService的运行。需要引导用户操作:- 将应用加入后台白名单
- 关闭应用的电池优化,跳转代码示例:
val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) startActivity(intent)
另外不要手动调用
startService启动该服务,系统会在用户开启权限后自动绑定并启动服务,手动启动的服务无法接收通知推送。验证测试通知的有效性
部分通知不会被监听,测试时尽量避开以下情况:- 应用自身发送的通知(部分系统版本存在限制)
- 已被用户屏蔽通知渠道的通知
- 系统级低优先级通知
可以用其他应用(如微信、短信)发送通知,或者自己写测试代码发送通知验证:
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val testChannel = NotificationChannel("test_channel", "测试渠道", NotificationManager.IMPORTANCE_DEFAULT) notificationManager.createNotificationChannel(testChannel) val testNotification = NotificationCompat.Builder(this, "test_channel") .setContentTitle("测试通知") .setContentText("用于验证通知监听的测试内容") .setSmallIcon(R.drawable.ic_notification) .build() notificationManager.notify(1, testNotification)
内容的提问来源于stack exchange,提问作者Valentin Vignal
相关产品推荐
相关产品推荐

