如何实现App通知禁用与启用 开发专注模式免打扰功能
专注类App通知拦截功能技术实现方案
移动端通知拦截能力完全依赖操作系统开放的权限接口,安卓、iOS两大平台的实现逻辑差异极大,没有跨平台统一方案,以下分平台说明具体落地路径:
安卓端实现路径
安卓系统开放了完整的通知监听、操作接口,可实现全量通知拦截:
- 首先声明核心服务:在App的
AndroidManifest.xml中声明NotificationListenerService组件,这是安卓官方提供的通知访问专属服务,没有这个组件的声明,后续所有逻辑都跑不通。 - 引导用户开启必要权限:首次使用功能时,跳转系统通知权限设置页,引导用户手动给App开启「通知读取权限」;如果适配安卓13及以上版本,还要额外申请
POST_NOTIFICATIONS运行时权限,保证App自身的专注状态提醒可以正常弹出。 - 实现拦截核心逻辑:自定义类继承
NotificationListenerService,重写onNotificationPosted方法——系统收到任何第三方App的通知时,都会触发这个回调,你可以在回调里拿到通知来源的包名、通知渠道、内容等元数据:- 基础拦截规则:提前维护拦截App包名列表,内置主流社交媒体、娱乐类App的包名(比如微信、抖音、微博、小红书等对应的官方包名),如果回调的通知来源在拦截列表、且当前专注模式为开启状态,直接调用
cancelNotification方法移除这条通知,用户就看不到弹窗、也收不到震动提醒。 - 自定义规则扩展:支持用户自行调整拦截名单,同时默认把系统核心通知(来电、预警短信、低电量提醒等)加入白名单,避免影响用户正常使用手机。
- 基础拦截规则:提前维护拦截App包名列表,内置主流社交媒体、娱乐类App的包名(比如微信、抖音、微博、小红书等对应的官方包名),如果回调的通知来源在拦截列表、且当前专注模式为开启状态,直接调用
- 状态联动逻辑:本地持久化存储专注模式的开关状态,只有开关打开时才执行拦截判断,专注模式关闭后直接跳过所有逻辑,减少不必要的后台性能消耗。
特别注意:
- 国内各家定制ROM(小米、华为、OV、荣耀等)默认对后台服务有极强的杀进程策略,必须在用户首次开启功能时,清晰引导用户将App加入后台自启动白名单、关闭系统对App的电池优化限制,否则
NotificationListenerService会被系统强制回收,拦截功能会随机失效。 - 不管是国内应用市场还是Google Play,都对通知读取权限的使用审核极严,绝对不能把拦截过程中拿到的通知内容上传到服务器,所有逻辑必须在本地完成,否则会直接被下架。
- 拦截名单不要完全硬编码在本地,可以做轻量的云端配置更新,覆盖新上线的App,不用每次加新的拦截目标都发新版。
iOS端实现路径
iOS的沙盒权限限制远严于安卓,不存在类似安卓的全局通知监听拦截私有接口可以绕过系统规则,所有通知屏蔽能力必须依托官方开放的系统专注框架实现,私自调用私有API会直接被App Store拒审,没有侥幸空间:
- 核心依赖框架:iOS 16及以上版本使用
FocusFilter框架,搭配Managed Settings框架实现规则配置,低于iOS 16的系统没有开放对应接口,只能引导用户手动开启系统自带的专注模式,做配套的计时、专注统计功能,无法实现自动拦截。 - 具体实现逻辑:
- 你不需要自己做通知监听,只需要在App内定义自定义专注模式的规则配置,请求用户授权将你的App的专注规则接入系统专注模式列表。
- 当用户在你的App内点击开启专注模式时,调用系统接口激活提前配置好的专注规则,由系统层面自动屏蔽规则内指定App的通知——你只需要把社交媒体类App加入规则的屏蔽列表即可,不需要App常驻后台。
- 如果要实现更细的控制(比如专注模式下仅允许特定联系人的来电、消息提醒),可以通过
FocusFilter的Intent扩展把自定义规则同步给系统,系统会自动按规则过滤通知。
特别注意:iOS端所有和通知拦截相关的操作,都必须让用户明确感知到是通过系统专注能力实现的,不能做任何隐藏的后台操作,否则审核大概率被拒。
通用体验优化建议
- 本地留存拦截记录:专注结束后可以给用户展示本次专注时长内一共拦截了多少条通知、分别来自哪些App,作为专注成果的正向反馈,注意所有记录仅存在用户本地,不要上传。
- 提供临时放行入口:支持用户在专注模式下临时放行某类通知、或者给单个App开白名单,不要做强制的一刀切拦截。
- 不要过度申请权限:除了功能必须的通知相关权限,不要申请和专注功能无关的敏感权限,容易引发用户反感,也过不了审核。
内容的提问来源于stack exchange,提问作者QueenBee
相关产品推荐
相关产品推荐

