HMSPush通知处理机制:NotificationManagerEx类的实现原理

HMSPush通知处理机制:NotificationManagerEx类的实现原理

【免费下载链接】HMSPush让非华为设备支持 HMS 推送,同时避免唤醒目标应用项目地址: https://gitcode.com/gh_mirrors/hm/HMSPush

HMSPush是一款让非华为设备支持HMS推送的开源项目,通过巧妙的技术实现避免唤醒目标应用,提升设备性能和续航。本文将深入解析其核心组件NotificationManagerEx类的实现原理,帮助开发者理解HMSPush如何在非华为设备上实现高效的通知处理。

NotificationManagerEx的核心作用

NotificationManagerEx是HMSPush通知处理的核心类,位于xposed/src/main/java/one/yufz/hmspush/hook/hms/nm/NotificationManagerEx.kt。它模拟了华为系统的通知管理机制,提供了完整的通知处理接口,包括通知的创建、更新、删除等关键操作。

双通知管理器设计

NotificationManagerEx采用了灵活的双通知管理器设计,能够根据系统状态智能选择合适的通知处理策略:

private fun createNotificationManager(): INotificationManager { return if (HookSystemService.isSystemHookReady) { XLog.d(TAG, "use SystemNotificationManager") SystemNotificationManager() } else { XLog.d(TAG, "use SelfNotificationManager") SelfNotificationManager() } }
  • SystemNotificationManager:当系统钩子准备就绪时使用,直接与系统通知服务交互
  • SelfNotificationManager:系统钩子未就绪时使用,自行处理通知管理

这种设计确保了HMSPush在不同系统环境下都能稳定工作,提供一致的通知体验。

通知处理的责任链模式

NotificationManagerEx通过责任链模式处理通知,将复杂的通知处理逻辑分解为多个独立的处理器。核心代码位于xposed/src/main/java/one/yufz/hmspush/hook/hms/nm/handler/NotificationHandlers.kt

object NotificationHandlers { private val handlers = listOf( LabelHandler(), IconHandler(), GroupNotificationHandler(), GroupByIdHandler(), FinalHandler() ) fun handle(manager: INotificationManager, context: Context, packageName: String, id: Int, notification: Notification) { HandlerChain(LinkedList(handlers)) .proceed(manager, context, packageName, id, notification) } }

这条责任链依次通过五个处理器处理通知:

  • LabelHandler:处理通知标签
  • IconHandler:处理通知图标
  • GroupNotificationHandler:处理通知分组
  • GroupByIdHandler:按ID处理通知分组
  • FinalHandler:最终处理并发送通知

核心通知处理流程

NotificationManagerEx的通知处理流程可以概括为以下几个关键步骤:

  1. 通知接收:通过notify()方法接收应用发送的通知
  2. 通知处理:调用NotificationHandlers处理通知
  3. 通知记录:通过PushHistory.record(packageName)记录通知历史
  4. 通知分发:根据当前环境选择合适的通知管理器发送通知

关键实现代码如下:

fun notify(context: Context, packageName: String, id: Int, notification: Notification) { XLog.d(TAG, "notify() called with: context = $context, packageName = $packageName, id = $id, notification = $notification") tryInvoke { NotificationHandlers.handle(notificationManager, context, packageName, id, notification) } PushHistory.record(packageName) }

异常处理机制

NotificationManagerEx还实现了完善的异常处理机制,确保在通知处理过程中出现异常时能够优雅地处理并记录日志:

private inline fun <R> tryInvoke(invoke: () -> R): R { try { return invoke() } catch (e: XposedHelpers.InvocationTargetError) { XLog.e(TAG, "tryInvoke: ", e) XLog.e(TAG, "tryInvoke targetException: ", e.cause) throw e.cause ?: e } catch (e: InvocationTargetException) { XLog.e(TAG, "tryInvoke: ", e) XLog.e(TAG, "tryInvoke targetException: ", e.targetException) throw e.targetException ?: e } catch (e: Throwable) { XLog.e(TAG, "tryInvoke: ", e) XLog.e(TAG, "tryInvoke cause: ", e.cause) throw e.cause ?: e } }

接口设计与实现

NotificationManagerEx实现了INotificationManager接口,提供了完整的通知管理功能。该接口定义在xposed/src/main/java/one/yufz/hmspush/hook/hms/nm/INotificationManager.kt,包含以下核心方法:

  • areNotificationsEnabled:检查通知是否启用
  • getNotificationChannel:获取通知渠道
  • notify:发送通知
  • createNotificationChannels:创建通知渠道
  • cancelNotification:取消通知
  • deleteNotificationChannel:删除通知渠道
  • getActiveNotifications:获取活跃通知
  • getNotificationChannels:获取通知渠道列表
  • clearHmsNotificationChannels:清除HMS通知渠道

总结

NotificationManagerEx作为HMSPush的核心组件,通过双通知管理器设计、责任链模式和完善的异常处理机制,实现了在非华为设备上高效处理HMS推送通知的功能。其灵活的架构设计确保了在不同系统环境下的稳定性和兼容性,同时避免唤醒目标应用,有效提升了设备性能和续航能力。

通过深入理解NotificationManagerEx的实现原理,开发者可以更好地掌握HMSPush的工作机制,为进一步定制和优化通知处理功能提供基础。如需了解更多细节,可以查看项目中的相关源代码文件,特别是通知管理器和处理程序的实现。

【免费下载链接】HMSPush让非华为设备支持 HMS 推送,同时避免唤醒目标应用项目地址: https://gitcode.com/gh_mirrors/hm/HMSPush

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考