Setrepeating() Of Alarmmanager Repeats After 1 Minute No Matter What The Time Is Set (5 Seconds In This Case, Api 18+)
Solution 1:
The documentation needs to be updated. As of I think Android 5.1 (API version 22) there is a minimum period of 1 minute for repeating alarms, and alarms cannot be set less than 5 seconds in the future.
If you need to do work within one minute, just set the alarm directly, then set the next one from that alarm's handler, etc.
If you need to do work within 5 seconds, post it to a Handler instead of using the alarm manager?
Solution 2:
Don't use setRepeating() or setInExactRepeating, it won't repeat after exactly 5 seconds. Instead, try scheduling the alarm once, then reschedule it again in the onReceive() method something like this. This will repeat after a particular time interval (5 seconds in this case)
MainActivity.java
publicclassMainActivityextendsAppCompatActivity {
Button btnStartAlarm, btnStopAlarm;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStartAlarm = (Button) findViewById(R.id.btnStartAlarm);
btnStopAlarm = (Button) findViewById(R.id.btnStopAlarm);
Intentintent=newIntent(MainActivity.this, AlarmReceiver.class);
finalPendingIntentpendingIntent= PendingIntent.getBroadcast(getApplicationContext(), 100, intent, 0);
finalAlarmManageralarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
btnStartAlarm.setOnClickListener(newView.OnClickListener() {
@OverridepublicvoidonClick(View view) {
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
}
});
btnStopAlarm.setOnClickListener(newView.OnClickListener() {
@OverridepublicvoidonClick(View view) {
alarmManager.cancel(pendingIntent);
}
});
}
}
AlarmReceiver.java
publicclassAlarmReceiverextendsBroadcastReceiver {
publicAlarmReceiver() {
}
@OverridepublicvoidonReceive(Context context, Intent intent) {
Log.d("Javed", "onReceive called");
Toast.makeText(context, "onReceive called", Toast.LENGTH_LONG).show();
Intentintent1=newIntent(context, AlarmReceiver.class);
finalPendingIntentpendingIntent= PendingIntent.getBroadcast(context, 100, intent1, 0);
finalAlarmManageralarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pendingIntent);
}
}
Solution 3:
Try this code:Calendar cal = Calendar.getInstance();
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
cal.getTimeInMillis(), 5000, pendingIntent);
Solution 4:
Try following code:
Long time=new GregorianCalendar().getTimeInMillis() +3000;
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,time,5000, pendingIntent);
Once you run this code the alarm will first trigger after 3 sec and every 5 sec there after.
Also try using a WakefulBroadcastReceiver
instead of BroadcastReceiver
as it looks like the phone is going in doze mode after some time(If you are on android M).Make sure you include the WAKE_LOCK
permission to use it correctly.
Additionally you must keep in mind,your alarm's first trigger will not be before the requested time, but it might not occur for almost a full interval after that time. In addition, while the overall period of the repeating alarm will be as requested, the time between any two successive firings of the alarm may vary.
Additionally
setInExactRepeating()
does not guarantee accuracy of the triggering time. You can use setRepeating()
before API 19 but beginning with API 19 (KITKAT) alarm delivery is inexact: the OS will shift alarms in order to minimize wakeups and battery use.
What you can do is, set a non-repeating alarm and when the alarm triggers you can reset the alarm again in your BroadcastReceiver
There are new APIs to support applications which need strict delivery guarantees; see setWindow(int, long, long, PendingIntent)
and setExact(int, long, PendingIntent)
. Applications whose targetSdkVersion is earlier than API 19 will continue to see the previous behavior in which all alarms are delivered exactly when requested.
Reference
Solution 5:
Try this
Calendarcur_cal=newGregorianCalendar();
PendingIntentpintent= PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManageralarm= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pintent);
alarm.setRepeating(AlarmManager.RTC, cur_cal.getTimeInMillis(), interval, pintent);
Post a Comment for "Setrepeating() Of Alarmmanager Repeats After 1 Minute No Matter What The Time Is Set (5 Seconds In This Case, Api 18+)"