You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android通知监听器后台无法触发方法问题求助

搞定NotificationListener后台失效的问题

兄弟,我之前踩过一模一样的坑!你这情况核心就是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

火山引擎 最新活动