Android中WhatsApp在应用被杀、锁屏时显示来电通知的实现原理?
WhatsApp锁屏/进程被杀时仍能展示来电通知的核心机制
嘿,这个问题问到点子上了——作为即时通讯应用,WhatsApp这套“死而复生”的来电提醒机制,本质是把Android系统给的「紧急场景特权」用到了极致,我给你拆解成几个核心环节:
1. 高优先级FCM推送:直接唤醒“已死”的进程
WhatsApp依赖Firebase Cloud Messaging(FCM)推送来电通知,但它用的不是普通推送,而是高优先级的数据消息:
- 普通推送可能被系统省电策略(比如Doze模式)延迟甚至拦截,但高优先级消息会被系统立刻处理,哪怕应用进程已经被杀掉。
- 收到这类消息时,系统会自动重启WhatsApp的
FirebaseMessagingService,触发onMessageReceived方法——这一步是核心,相当于给“死掉”的应用拉了一把,让它有机会启动后续流程。
2. 全屏Intent:突破锁屏直接弹来电界面
仅仅唤醒进程还不够,要在锁屏时展示来电界面,WhatsApp用到了Android的setFullScreenIntent API:
- 这个API是专门给紧急场景(比如来电、警报)设计的,它可以在锁屏状态下直接启动全屏Activity,不需要用户先解锁手机。
- 实现时,会在构建通知时传入指向来电界面的PendingIntent,同时设置
setFullScreenIntent(pendingIntent, true)——第二个参数true表示如果系统处于锁屏状态,直接展示全屏界面,而非普通通知。 - 这里要注意:这个Intent必须配合
FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP等标记,确保即使进程被杀,也能正确启动目标Activity。
3. 特殊通知渠道:突破系统的通知拦截
从Android 8.0(API 26)开始,所有通知都必须归属到某个渠道,WhatsApp给来电专门创建了最高重要性的通知渠道:
- 这个渠道的重要性被设为
IMPORTANCE_HIGH甚至IMPORTANCE_MAX,系统会默认允许它弹出通知、发出声音、震动,甚至在状态栏显示横幅。 - 更关键的是,这类高优先级渠道的通知不会被系统的“智能通知管理”或者用户误操作轻易屏蔽——毕竟来电属于紧急场景,系统会给这类渠道开绿灯。
4. 权限与系统适配:绕开后台限制
为了确保整个流程顺畅,WhatsApp还申请了几个关键权限,适配不同Android版本的限制:
- 忽略电池优化权限:申请
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,让系统允许WhatsApp在Doze模式下被唤醒,不会被省电策略卡住。 - 锁屏显示权限:申请
ACCESS_NOTIFICATION_POLICY和USE_FULL_SCREEN_INTENT,确保来电通知能在锁屏上正常显示,全屏Intent能被系统允许。 - 针对Android 10+的后台启动限制:全屏Intent属于系统认可的“紧急例外”,所以即使应用在后台,也能直接启动来电界面,不会被系统拦截。
简单总结就是:高优先级FCM唤醒进程 → 触发全屏Intent弹出来电界面 → 高优先级通知渠道确保通知不被拦截 → 特殊权限绕开系统的省电和后台限制,这几个环节环环相扣,就实现了哪怕进程被杀、手机锁屏,也能及时展示来电的效果。
内容的提问来源于stack exchange,提问作者Sobinscott
相关产品推荐
相关产品推荐

