AlarmManager未在Air模式下唤醒手机(onReceive延迟)

时间:2013-05-22 09:59:59

标签: android alarmmanager

问题是onReceive通常由BroadcastReceiver“调用”的AlarmManager方法被延迟,直到设备被用户唤醒为止。

这从未发生在我身上,只有我所拥有的信息来自用户发送的报告。在日志中,我看到在第一种情况下onReceive方法调用延迟了近2小时,在第二种情况下延迟了大约20分钟。在这两种情况下,警报(和onReceive)在用户唤醒电话之后就开始了。

问题已连续两天发生两次,用户说它以前从未发生过。只有手机设置的独特变化才能启用Air Mode。

我的代码:

警报设置如下:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
Logger.log("posting alarm " + id + " for " + formatTime(timeInMillis);

广播接收者的onReceiveMethod:

@Override
public void onReceive(Context context, Intent intent) {
    Logger.initialize(context, "AlarmReceiver");
    ...
}

从用户收到的日志:

481. 20/05 13:00:04 v89: posting alarm 4 for 7:0 (in 17:59)
486. 21/05 08:58:00 v89: logger initialized again from AlarmReceiver

536. 21/05 09:04:54 v89: posting alarm 4 for 7:0 (in 21:55)
541. 22/05 07:22:24 v89: logger initialized again from AlarmReceiver

Air Mode是否有可能以某种方式阻止手机的觉醒?我能预防吗?或者它可能是完全不同的东西?欢迎任何帮助。

设备是采用Android 4.1.2的三星Galaxy SIII(GT-I9305)

编辑: 如果延迟可能以某种方式由Logger引起,这是它的代码。 mHandler是使用HandlerThread创建的,因此我认为它无法阻止onReceive,对吧?

public synchronized static void initialize(Context context, String src) {
    if (mInstance == null) {//wasn't null
       ...
    } else {
        Logger.log("logger initialized again from " + src);
    }
}

public synchronized static void log(final String text) {
    Log.d(TAG, text);
    if (mInstance != null && mInstance.mLoggingEnabled) {
        mInstance.mHandler.post(new Runnable() {
            @Override
            public void run() {
                //some database operations
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

如果要按指定的时间间隔安排任务,请不要使用方法AlarmManager.RTC的标记AlarmManager.RTC_WAKEUPalarm.setRepeating(...)。因为在这种情况下,警报将受限于设备的实时时钟。因此,更改系统时间可能会导致警报错误。您必须使用标记AlarmManager.ELAPSED_REALTIMEAlarmManager.ELAPSED_REALTIME_WAKEUP。在这种情况下,SystemClock.elapsedRealtime()将作为安排警报的基础。

代码如下:

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + checkIntervalMillis, checkIntervalMillis, pendingIntent);

如果您希望在处于睡眠模式的设备执行长时间运行的任务时,我建议使用CommonsWare的WakefulIntentService库:https://github.com/commonsguy/cwac-wakeful