系统开发过程中,经常会遇到Android心跳机制,待机耗流问题,几乎都跟AlarmMangerService有关,本文从应用层到kernel记录下整个处理流程。
应用层
样例代码:
AlarmManager mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
...
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + delayInMs, mDataStallAlarmIntent);
可以通过获取ALARM_SERVICE来设置Alarm,
第一个参数表示Alarm的类型,可选择0,1,2,3;(当系统休眠时,0和2会主动唤醒,1和3不会)
第二个参数表示Alarm到期的时间;
第三个参数表示Alarm到期时处理的intent事件。
framework层
文件frameworks/base/services/core/java/com/android/server/AlarmManagerService.java
在Alarm service运行时会启动AlarmThread线程,waitForAlarm一直等待JNI层传递闹钟到期事件。
@Override
public void onStart() {
//初始化jni层,打开alarm节点设备
mNativeData = init();
mNextWakeup = mNextNonWakeup = 0;
// We have to set current TimeZone info to kernel
// because kernel doesn't keep this after reboot
setTimeZoneImpl(SystemProperties.get(TIMEZONE_PROPERTY));
PowerManager pm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WA