问题是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
}
});
}
}
答案 0 :(得分:0)
如果要按指定的时间间隔安排任务,请不要使用方法AlarmManager.RTC
的标记AlarmManager.RTC_WAKEUP
和alarm.setRepeating(...)
。因为在这种情况下,警报将受限于设备的实时时钟。因此,更改系统时间可能会导致警报错误。您必须使用标记AlarmManager.ELAPSED_REALTIME
或AlarmManager.ELAPSED_REALTIME_WAKEUP
。在这种情况下,SystemClock.elapsedRealtime()
将作为安排警报的基础。
代码如下:
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + checkIntervalMillis, checkIntervalMillis, pendingIntent);
如果您希望在处于睡眠模式的设备执行长时间运行的任务时,我建议使用CommonsWare的WakefulIntentService库:https://github.com/commonsguy/cwac-wakeful