AlarmManager不会在预期时间重复

时间:2014-04-12 19:37:30

标签: android alarmmanager

我希望每隔预定时间启动一项服务。 从我的主要活动中,我使用以下代码调用WakefulBroadcastReceiver的SetAlarm方法:

public class MyReceiver extends WakefulBroadcastReceiver  {
   public static final String PREFS = "Prefs";
   SharedPreferences mSettings;
   @Override
   public void onReceive(Context context, Intent intent) {
   Log.i("Receiver", "START");
   Intent service = new Intent(context, Awservice.class);
   startWakefulService(context, service);
}

public void SetAlarm(Context context)  {
   String Hour = getDuration(context, "PREFS_HOURS","0");
   String Min = getDuration(context, "PREFS_MINUTES","0");
   Long LHour = Long.parseLong(Hour);
   Long LMinutes = Long.parseLong(Min);
   Long time = (LHour*60+LMinutes)*60*1000;
   AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
   Intent intent = new Intent(context, MyReceiver.class);
   PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
   am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+time, time , pi);
}

public void CancelAlarm(Context context) {
   Intent intent = new Intent(context, MyReceiver.class);
   PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
   AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
   alarmManager.cancel(sender);
}

String getDuration(Context context, String value, String defaultValue) {
   SharedPreferences mSettings = context.getSharedPreferences(PREFS, Activity.MODE_PRIVATE);
   return mSettings.getString(value, defaultValue).toString();
}

问题是我的代码有效但不准确。 例如如果我每2分钟设置一次激活时间,广播接收器不会每2分钟工作一次,但如下所示:

21:32:52.068
21:33:27.842
21:36:38.258
21:37:59.437
21:39:42.178
21:41:30.643
21:43:27.898
21:45:42.199

有什么问题?提前谢谢!

1 个答案:

答案 0 :(得分:0)

在将android:targetSdkVersion设置为19的项目中,setRepeating()将不准确。来自the docs

  

注意:从API 19(KITKAT)开始,警报传递是不准确的:操作系统   将移动警报以最小化唤醒和电池使用。那里   是支持需要严格交付的应用程序的新API   担保;请参阅setWindow(int,long,long,PendingIntent)和   setExact(int,long,PendingIntent)。应用程序   targetSdkVersion早于API 19将继续看到   以前的行为,其中所有警报都在何时传递   请求。

来自CommonsWare的Busy Coders guide

  

获得精确重复的唯一方法是使用setExact()和   自己重新安排活动,而不是依靠Android做   那个为你自动。理想情况下,您使用setInexactRepeating()来   有助于延长电池寿命。