首页 > 其他分享 >Android通知监听服务之NotificationListenerService使用篇

Android通知监听服务之NotificationListenerService使用篇

时间:2022-11-05 14:07:00浏览次数:54  
标签:红包 val 微信 监听 onNotificationPosted 通知 Android sbn NotificationListenerService


前言

本篇我们将介绍如何利用NotificationListenerService实现类似智能手表通知同步、微信自动抢红包等功能。实现这些功能的原理其实就是监听系统的通知服务,接下来我们来看该如何实现。

NotificationListenerService的使用

创建NotificationListenerService

在Android中如果我们想要监听系统的通知,就需要实现一个服务,继承自NotificationListenerService,新建NotificationMonitorService类,代码如下所示。

class NotificationMonitorService : NotificationListenerService() {
//收到通知时的回调
override fun onNotificationPosted(sbn: StatusBarNotification) {
super.onNotificationPosted(sbn)
}

//通知移除时的回调
override fun onNotificationRemoved(sbn: StatusBarNotification?) {
super.onNotificationRemoved(sbn)
}
}

这里我们重写onNotificationPosted方法和onNotificationRemoved方法,这两个方法分别会在收到通知和通知被移除时调用。这里我们着重来看onNotificationPosted方法。

在onNotificationPosted方法中有一个StatusBarNotification实例,通过这个实例我们可以获取通知消息的包名、内容等。代码如下所示。

class NotificationMonitorService : NotificationListenerService() {
override fun onNotificationPosted(sbn: StatusBarNotification) {
super.onNotificationPosted(sbn)
val extras = sbn.notification.extras
// 获取接收消息APP的包名
val notificationPkg = sbn.packageName
// 获取接收消息的抬头
val notificationTitle = extras.getString(Notification.EXTRA_TITLE)
// 获取接收消息的内容
val notificationText = extras.getString(Notification.EXTRA_TEXT)
Log.d("收到的消息内容包名:", notificationPkg)
Log.d("收到的消息内容", "Notification posted $notificationTitle & $notificationText")
}
}

然后记得在配置文件中添加这个Service的声明,代码如下所示。

<service android:name="com.example.myapplication.NotificationMonitorService"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>

创建好NotificationMonitorService之后,接下来我们就可以启动这个服务了。

启动服务

现在直接启动服务,肯定是没办法监听到系统通知的,在启动服务前,我们应该授予App监听系统通知的权限。

在AndroidManifest.xml中添加权限,代码如下所示。

<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>

启动服务前判断是否开启了监听通知的权限,如果没有则跳转到设置页开启,代码如下所示。

if (NotificationManagerCompat.getEnabledListenerPackages(this).contains(packageName)){
val intent = Intent(this,NotificationMonitorService::class.java)
startService(intent)
}else{
startActivity(Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"))
}

如果没有开启,跳转到的设置页如下所示。

Android通知监听服务之NotificationListenerService使用篇_Notification

Android通知监听服务之NotificationListenerService使用篇_手表通知_02

开启了监听通知权限,运行程序,打印日志如下所示。

Android通知监听服务之NotificationListenerService使用篇_微信抢红包_03

 对应的打印日志是,收到了来自微信的群聊消息,发了一个“强”。

当收到短信、来电等消息时,系统同样会发送一个通知,我们可以根据收到的通知处理不同的业务。这里感兴趣的读者可自行尝试。接着我们来模拟实现自动抢红包的功能。

实现自动抢红包功能

这里为了测试,历尽千辛万苦让我老婆给我发了一个0.01的红包,我们监听到的内容为“[微信红包]恭喜发财,大吉大利”。如下图所示。

Android通知监听服务之NotificationListenerService使用篇_手表通知_04

 所以我们可以在收到消息时,通过监听微信包名、以及消息内容来判断是否收到了微信红包来处理具体的操作。(不处理,别人故意发同样的文字)。

if (notificationPkg.equals("com.tencent.mm")){
if (notificationText.equals("[微信红包]恭喜发财,大吉大利")){
//收到微信红包了
}
}

这样我们只需要在代码处处理接下来的操作就可以了。其实我们的操作也很简单,只需要在监听到有红包时打开对应的微信页面即可,代码如下所示。

class NotificationMonitorService : NotificationListenerService() {
override fun onNotificationPosted(sbn: StatusBarNotification) {
super.onNotificationPosted(sbn)
val extras = sbn.notification.extras
// 获取接收消息APP的包名
val notificationPkg = sbn.packageName
// 获取接收消息的内容
val notificationText = extras.getString(Notification.EXTRA_TEXT)
if (notificationPkg.equals("com.tencent.mm")){
if (notificationText.equals("[微信红包]恭喜发财,大吉大利")){
//收到微信红包了
val intent = sbn.notification.contentIntent
intent.send()
}
}
}
}

这里我们直接通过sbn拿到notification的intent,进行intent.send操作即可,运行程序,收到红包后,页面将自动跳转到微信红包页面,结果如下图所示。

Android通知监听服务之NotificationListenerService使用篇_微信抢红包_05

写在最后

利用通知监听服务这一功能,我们可以实现许多诸如 智能手表的消息同步、微信抢红包等功能,如果你有需要,也可以让你女朋友的消息立即弹出,这样就再也不用跪搓衣板啦~

下一篇我们将着重深挖监测通知服务的原理,下一篇见~

标签:红包,val,微信,监听,onNotificationPosted,通知,Android,sbn,NotificationListenerService
From: https://blog.51cto.com/u_15477127/5825934

相关文章

  • Android 明年将不再支持 32 位应用
    上周,Google正式发布了Android13并率先向Pixel设备推送了系统更新,其他OEM厂商也将跟进这一最新系统,并会在今年晚些时候向他们旗下的设备推送更新。近日,MishaalRahma......
  • Android实现Gestures捕获
    效果图   MainActivitypublicclassMainActivityextendsAppCompatActivityimplementsGestureDetector.OnGestureListener{privateGestureDetector......
  • Android实现UDP通信
    TCP和UDP的不同上次我们讲的是TCP的socket,他们之间的不同在于,tcp要等待客户端的接入,然后获得客户端socket然后进行IO操作,udp直接传送数据即可  图片来源:面试官:说说U......
  • Android 报错:error: too many padding sections on bottom border
     在androidstudio点击png文件修改,把多条黑边改成2条黑边即可 Android报错:error:toomanypaddingsectionsonbottomborder 一、发生错误【我以为我做......
  • 【Android Gradle 插件】自定义 Gradle 插件优化图片 ③ ( 识别 png 图片中的 alpha
    文章目录​​一、识别png图片中的alpha通道信息​​​​1、png图片的文件头信息​​​​2、png图片的数据块​​​​3、png图片的IHDR类型数据块​​​​4、IHDR......
  • Android 嵌套布局简析
    前言嵌套布局是事件分发的衍生内容,理解了嵌套布局的实现方式,Md的很多效果都是毛毛雨了​​原文地址进入​​Uml时序图形嵌套布局实现方式,以及5.0中与嵌套布局有关联的......
  • Android 8.0 + Service开启方式兼容处理
    Android8.0+,对后台服务进行了限制了。如果依然采用之前startService()方式。会导致问题。前后台服务的一些区别:类别区别应用前台服务会在通知一栏显示ONGOING的Notifi......
  • 从android 谈重构
    什麽是重构可以运作的程式跟可以维护的程式之间,还有一道难以言说的鸿沟。一个程式设计之初,是用来解决特定问题。就像在前面章节的学习中,我们也已......
  • Android的BLE广播数据包解析---Android系列, 蓝牙技术(含BLE)
      一、引言理解和分析这个数据包结构(这里面也涉及广播间隔时间的设置,设备广播数据间隔设置长了,会影响设备被发现的效率;设置短时,又响应功耗)。我们所说的BLE设备,其实......
  • 预备知识: web监听器ServletContextListener
    在ServletAPI中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。当Servlet容器启动或终止Web应用时,会触发Serv......