Android通知监听器后台无法触发方法问题求助
兄弟,我之前踩过一模一样的坑!你这情况核心就是Android越来越严的后台管控在搞鬼,再加上几个容易忽略的权限配置问题,我给你一步步梳理解决方案:
先确认通知访问权限真的开了
别光看代码里的申请逻辑,用户必须手动去系统设置里给应用开启「通知访问权限」!不同品牌手机路径有点不一样,大致是:
设置 > 通知 > 通知访问权限(小米叫「通知使用权」,华为可能在「应用权限」里找),找到你的应用后一定要确保开关是打开的。
建议在应用里加个权限检测逻辑,每次启动都检查一下权限状态,如果没开就直接跳转到设置页面引导用户开启,不然很多用户根本不知道要手动开这个权限。给服务加上「前台服务」身份(Android 8.0+必做)
Android 8.0(API 26)之后,普通后台服务很容易被系统回收,要让NotificationListener在后台稳定运行,必须把它改成前台服务。在你的onCreate方法里加这段代码:@Override public void onCreate() { super.onCreate(); context = getApplicationContext(); // 适配Android 8.0+的前台服务要求 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 创建通知渠道 NotificationChannel channel = new NotificationChannel("notification_listener_channel", "通知监听服务", NotificationManager.IMPORTANCE_LOW); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (notificationManager != null) { notificationManager.createNotificationChannel(channel); } // 构建前台通知 Notification foregroundNotification = new Notification.Builder(this, "notification_listener_channel") .setContentTitle("通知监听中") .setContentText("正在监听系统通知") .setSmallIcon(R.drawable.ic_your_notification_icon) // 替换成你自己的图标 .build(); // 启动前台服务 startForeground(1001, foregroundNotification); } }加了这个之后,系统就不会随便杀掉你的监听服务了,代价是状态栏会有个低优先级的通知,不过这是合规的做法。
把应用从电池优化里排除
国产ROM(小米、华为、OPPO、vivo这些)的电池优化太狠了,后台应用分分钟被休眠。你得引导用户把你的应用加入电池优化白名单:
可以用这段代码跳转到对应的设置页面:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); }记得在Manifest里加上对应的权限:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />检查Manifest的服务配置有没有错
最后再确认一下你的NotificationListenerService在Manifest里的注册是否正确,必须包含BIND_NOTIFICATION_LISTENER_SERVICE权限和对应的action:<service android:name=".NotificationListener" android:label="你的通知监听服务名称" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>这个权限和intent filter缺一不可,少了的话服务根本无法正常绑定系统通知服务。
把这些步骤都做完,你的NotificationListener应该就能在后台正常触发onNotificationPosted方法了!
内容的提问来源于stack exchange,提问作者Msb Says




