警报管理器在特定的给定时间间隔内不工作

Alarm Manager not working at specific given time interval

您好,我在 3 分钟的特定时间间隔内使用警报管理器,然后我开始监控。它有时有效,突然我注意到有不规则的时间间隔,这是不正确的!您可以在附加日志中看到 "20-Jul-2016 12:22:03 pm" 时间不同!我连接了phone并关闭了屏幕并进行了监控!每 3 分钟,我访问服务器并获得响应 1。但是有一次,访问服务器需要 5 分钟!为什么会出现这个奇怪的问题?

这是代码。

 public void startAt3() {
    Intent alarmIntent = new Intent(ActivityTracking.this, AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(ActivityTracking.this, 0, alarmIntent, 0);
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                        /* Set the alarm */
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    /* Repeating on every 3 minute interval */
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            calendar.getTimeInMillis(),
            180000L, pendingIntent);
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
    Log.e("alarm",mydate);

}

报警接收器:

   public class AlarmReceiver extends WakefulBroadcastReceiver    {//AlarmReceiver class
@Override
public void onReceive(Context context, Intent intent) {//onReceive method
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
    Log.e("alarm",mydate);
    Intent service = new Intent(context, SimpleWakefulService.class);//intent to call another class
    // Start the service, keeping the device awake while it is launching.
    startWakefulService(context, service);//service started
}

SimpleWakefulService:

    public class SimpleWakefulService extends IntentService {
      public SimpleWakefulService() {
        super("SimpleWakefulService");//instantiates simpleWakefulService

    }
     @Override
     protected void onHandleIntent(Intent intent) {
        Log.e("simpleWakeful","simpleWakeful");
      serviceCall(this); //here is downloadTaskMethod called and getting response as 1.
  }

您可以从 AlarmManager 的官方文档中看到,从 Android 版本 19 (KitKat) 开始,计划的警报将不准确,即使它们被标记为准确(尽管您已经有 inexactRepeating())。

警报将与系统事件捆绑在一起,以最大限度地减少设备唤醒和电池使用,这就是您所看到的。这是设计使然。

不要使用 setInexactRepeating。顾名思义,这不会安排闹钟在准确的时间响起。

你可以这样使用:

public void scheduleSingleAlarm(Context context) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    PendingIntent pendingUpdateIntent = PendingIntent.getBroadcast(context,
            SINGLE_ALARM_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    Calendar futureDate = Calendar.getInstance();
    futureDate.add(Calendar.MINUTE, 3);

    setSingleExactAlarm(futureDate.getTime().getTime(), pendingUpdateIntent);
}

@SuppressLint("NewApi")
private void setSingleExactAlarm(long time, PendingIntent pIntent) {
    if (android.os.Build.VERSION.SDK_INT >= 19) {
        mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pIntent);
    } else {
        mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, pIntent);
    }
}

当您接到闹钟的来电时,安排另一个闹钟在三分钟后响起。我已经在博客上写过这个 here