转载自:徐宜生微信原创文章 Android中的睡与不睡
提问
今天有朋友在微信上问我,为什么手机进入休眠后,还能收到电话、QQ的消息呢?
这个问题看上去好像很普通,实际上,估计很多人都不见得能够说的清楚。
那么实际上,在一般正常的情况下,系统在屏幕关闭后,就会开始Suspend所有进程,准备进入睡眠,这个过程根据手机的不同而不同,一般在10s左右即会进入正常的睡眠。按照这个说法,一旦手机睡着了,应该就收不到任何消息、电话了,但实际上,并不是这样,其中原因,和Android的系统架构有关。
在手机中,实际上有两个处理器,一个叫Application Processor,即AP处理器,一个叫Baseband Processor,即BP处理器。其中AP就是我们一般说的CPU,它通常是ARM架构,当然也有奇葩的x86架构,它用于运行我们的Android系统,在非睡眠情况下,AP的功耗非常高,特别是在绘图、计算、渲染等场景下。而BP则是另一个经常不为人知的处理器,他用于运行实时操作系统,手机最基本的通信协议栈就运行在BP的实时操作系统上,BP的功耗非常低,基本不会进入睡眠。
当手机正常进入睡眠后,AP就会被睡眠,而只有BP在工作,这也是基于降低功耗的考虑。那么睡眠后,我们是如何收到消息的呢?前面说了,整个通信协议栈是运行在BP上的,那么当有消息数据包到达时,BP就会唤醒AP,进行相应的处理。
同时,Android API还提供了WakeLock机制,那么为什么要设计这个机制呢?前面说了,一旦用户按电源键进行睡眠,AP中的所有进程都讲被Suspend掉,那么某些程序的关键代码,就有可能不能被执行,所以,Android提供了WakeLock来让开发者在睡眠模式下也能阻止AP进入睡眠,在运行完关键代码后,再进行睡眠。但是,这个机制也成为了很多App耗电的原因,开发者必须谨记,WakeLock必须在结束时释放,这比内存泄漏还要严重百倍。
在Android系统中,还有个比较奇葩的东西,那就是AlarmManager,这个东西可以用来做定时、做闹钟,相信大家都知道了,但是它到底运行在AP还是BP呢?显然不会是AP,因为在睡眠模式下,我们也能收到闹钟,实际上,AlarmManager运行在一个独立的RTC芯片中,通过向AP直接发送中断请求来唤醒AP。
点击原文,可以向我提问~~