0

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

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

问题连续两天出现两次,用户表示以前从未发生过。手机设置的唯一显着变化是启用了空中模式。

我的代码:

闹钟设置如下:

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

空中模式是否有可能以某种方式阻止手机的唤醒?我可以阻止它吗?或者也许它是完全不同的东西?欢迎任何帮助。

设备是三星 Galaxy SIII (GT-I9305) 安卓 4.1.2

编辑:以防万一延迟可能是由记录器引起的,这是它的代码。mHandler是使用 of 创建的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
            }
        });
    }
}
4

1 回答 1

0

如果您想以指定的时间间隔安排任务,请不要使用标志AlarmManager.RTCAlarmManager.RTC_WAKEUP方法alarm.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

于 2013-05-22T10:13:19.583 回答