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的通知处理流程可以概括为以下几个关键步骤:
- 通知接收:通过
notify()方法接收应用发送的通知 - 通知处理:调用NotificationHandlers处理通知
- 通知记录:通过
PushHistory.record(packageName)记录通知历史 - 通知分发:根据当前环境选择合适的通知管理器发送通知
关键实现代码如下:
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),仅供参考