
通过实现 notificationlistenerservice,android 应用可在用户授权后实时监听系统中所有已发布通知,获取其标题、内容、包名、时间、甚至自定义视图中的文本与图片资源(需适配解析逻辑)。
在 Android 中,从 API 18(Android 4.3)起,系统提供了 NotificationListenerService 机制,允许具备相应权限的应用监听、读取和管理设备上其他应用发出的通知。这为构建通知聚合器、无障碍辅助工具或消息同步类应用提供了核心能力。
✅ 基本使用步骤
-
声明服务并配置权限
在 AndroidManifest.xml 中注册服务,并声明必要权限:
-
继承 NotificationListenerService 并重写关键方法
示例 Kotlin 实现:
class MyNotificationListenerService : NotificationListenerService() {
override fun onNotificationPosted(sbn: StatusBarNotification, rankingMap: RankingMap) {
val packageName = sbn.packageName
val notification = sbn.notification
// 提取标准字段(兼容大多数通知)
val title = notification.extras.getCharSequence(Notification.EXTRA_TITLE)?.toString() ?: ""
val text = notification.extras.getCharSequence(Notification.EXTRA_TEXT)?.toString() ?: ""
val subText = notification.extras.getCharSequence(Notification.EXTRA_SUB_TEXT)?.toString() ?: ""
// 获取通知时间(毫秒时间戳)
val postTime = sbn.postTime
// 日志或本地处理
Log.d("NotifListener", "[$packageName] $title — $text (at $postTime)")
}
override fun onNotificationRemoved(sbn: StatusBarNotification, rankingMap: RankingMap) {
Log.d("NotifListener", "Removed: ${sbn.packageName}")
}
}-
引导用户手动开启通知访问权限
该服务需用户显式授权,无法动态申请。需跳转至系统设置页:
// 检查是否已启用
val enabled = Settings.Secure.getString(
contentResolver,
"enabled_notification_listeners"
).contains(packageName)
if (!enabled) {
Toast.makeText(this, "请在设置中启用本应用的通知访问权限", Toast.LENGTH_LONG).show()
startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS))
}⚠️ 注意事项与限制
- 权限敏感性高:BIND_NOTIFICATION_LISTENER_SERVICE 是系统级权限,仅允许绑定服务,不开放给第三方直接声明;实际启用依赖用户手动授权。
- 隐私与合规要求:自 Android 8.0(API 26)起,Google Play 强制要求声明数据安全表(Data Safety Form),明确说明“读取通知”属于敏感行为,需向用户清晰披露用途。
- 自定义通知内容需解析 RemoteViews:若通知使用了 setCustomContentView(),其文本/图片无法通过 extras 直接获取,需调用 notification.contentView?.apply { }(需反射或兼容性处理),且受限于 Android 版本与签名验证(部分厂商 ROM 可能屏蔽)。
- 后台限制增强:Android 9+ 对后台服务更严格,NotificationListenerService 本身由系统托管,不受常规后台限制影响,但仍需避免在 onNotificationPosted 中执行耗时操作(如网络请求、磁盘写入),建议交由 WorkManager 或 CoroutineScope 异步处理。
✅ 总结
NotificationListenerService 是 Android 官方支持的、唯一合法获取其他应用通知元数据的标准方案。它适用于需要响应式感知通知场景(如智能手表同步、语音播报、防沉迷提醒等),但开发者必须尊重用户隐私、严格遵循权限最小化原则,并做好各 Android 版本及 OEM 定制系统的兼容性测试。切勿尝试绕过该机制(如无障碍服务模拟、Xposed 插件等),既违反政策也存在严重安全与稳定性风险。










