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

Android应用被终止时如何监听其他应用的通知?

Android应用被终止时如何监听其他应用的通知?

嘿,别着急,作为Android新手碰到这个问题太正常了,我来帮你理清楚关键所在,一步步解决你的困惑~

首先要明确:你之前用BroadcastReceiver的思路是错的,Android系统监听其他应用通知的官方方案是用NotificationListenerService,而不是BroadcastReceiver——这也是你配置了权限却没效果的核心原因。

为什么不能用BroadcastReceiver?

BroadcastReceiver是用来接收系统或其他APP发送的广播事件的,但通知的监听并不是通过广播机制传递的。系统会直接和NotificationListenerService进行交互,所以你之前在Manifest里配置的Receiver完全起不到作用,删掉就好。

正确的实现步骤

1. 创建自定义的NotificationListenerService类

继承NotificationListenerService,重写onNotificationPosted方法——这个方法就是系统在有新通知到来时会主动回调的入口,你可以在这里处理通知数据:

class MyNotificationListener : NotificationListenerService() {
    override fun onNotificationPosted(sbn: StatusBarNotification?) {
        super.onNotificationPosted(sbn)
        sbn?.let {
            // 过滤你想要监听的APP,比如只处理WhatsApp的通知
            if (it.packageName == "com.whatsapp") {
                val notification = it.notification
                // 提取通知的标题、内容等信息
                val title = notification.extras.getString(android.app.Notification.EXTRA_TITLE)
                val content = notification.extras.getString(android.app.Notification.EXTRA_TEXT)
                
                // 这里执行你想要的操作,比如保存数据、触发其他逻辑
            }
        }
    }
}

2. 在Manifest中正确注册服务

注意注册的是service标签,不是receiver,权限和action必须严格对应:

<service
    android:name=".MyNotificationListener"
    android:label="我的通知监听服务" <!-- 这个标签会显示在系统设置里,用户能看到 -->
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

3. 引导用户开启通知访问权限

这个权限是特殊系统权限,不能通过普通的requestPermissions请求,必须引导用户到系统设置页面手动开启:

fun openNotificationAccessSettings(context: Context) {
    val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS")
    context.startActivity(intent)
}

在你的APP启动时或者需要功能的时候,调用这个方法,提示用户开启权限——没有这个权限,服务完全不会工作。

4. 关于APP被杀后的有效性

只要用户开启了通知访问权限,NotificationListenerService是由系统托管的:即使你的APP进程被杀,当有新通知到来时,系统会自动重启你的服务(除非用户在系统设置里关闭了权限,或者你的APP被强制停止)。

不过要注意:部分国内厂商的定制ROM有后台限制策略,可能需要引导用户把你的APP加入后台白名单,避免服务被系统强制限制。

总结一下

  • 删掉你之前配置的BroadcastReceiver,改用NotificationListenerService
  • 按照上述步骤配置服务和权限
  • 必须引导用户开启系统的通知访问权限

这样就能实现即使APP被杀,也能监听目标应用通知的功能啦~

备注:内容来源于stack exchange,提问作者Temporiz

火山引擎 最新活动