2013-05-22 113 views
0

问题是 BroadcastReceiver的方法通常会被AlarmManager“呼叫”,直到用户唤醒设备。AlarmManager未在空气模式下唤醒电话(onreceive延迟)

这从来没有发生过我,只有我得到的信息是来自用户发送的报告。在日志中,我看到在第一种情况下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)采用Android 4.1.2

编辑: 只是在拖延可能被记录器以某种方式造成的情况下,这里是它的代码。 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

嗨科格,做你曾经找到过这个问题的解决方案吗? – ChriPf

+0

@ChriPf我无法重现它。此外,我失去了与用户的联系,并且错误再也没有报告过 – Koger

回答

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

+0

感谢您对使用ELAPSED_TIME的评论 - 我实际上在电话时间改变后开始报警。至于第二部分 - 我在稍后在onReceive中创建了WakeLock - 问题看起来像onReceive没有按时调用。我添加了Logger.initialize的代码 - 它似乎不是一个长时间运行的任务,是吗? – Koger

+0

我有一个建议。如果用户在设置闹钟后关闭手机,则此闹钟将被取消。所以如果你有BOOT_COMPLETED接收器重新安排你的闹钟,你可以看到你描述的行为。用户重新启动手机后,闹钟将安排在比预期晚的时间。 – makovkastar

+0

那不是它 - 重新启动也被记录下来 – Koger

相关问题