I have the same problem, but pendingIntent starts after 5 seconds, not 2, as I try to install.
alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2 * 1000, pIntent);
If I set 5 seconds or more, alarmManager starts exactly. I don’t know what time span I will get in the working environment, so I choose 1 minute as a short time span.
So my application used postDelayed() instead of alarmManager for short time intervals and alarmManager for long time.
Code example:
if (delay == 0) { Intent intent = new Intent(context, SoundService.class); intent.putExtra(SoundService.SOUND, sound); context.startService(intent); } else if (delay <= 60) { (new Handler()).postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(context, SoundService.class); intent.putExtra(SoundService.SOUND, sound); context.startService(intent); } }, delay * 1000); } else if (delay > 60) { final int SDK_INT = Build.VERSION.SDK_INT; Intent intent = new Intent(context, AlarmBroadcastReceiver.class); intent.setAction("action_play: " + sound); intent.putExtra(SoundService.SOUND, sound); PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); long runTime = System.currentTimeMillis() + delay * 1000; if (SDK_INT < Build.VERSION_CODES.KITKAT) { alarmManager.set(AlarmManager.RTC_WAKEUP, runTime, pIntent); } else if ((SDK_INT >= Build.VERSION_CODES.KITKAT) && (SDK_INT < Build.VERSION_CODES.M)) { alarmManager.setExact(AlarmManager.RTC_WAKEUP, runTime, pIntent); } else if (SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, runTime, pIntent); } }
Where SoundService - Service with sound functions, delay - delay before playback, in seconds, AlarmBroadcastReceiver -
public class AlarmBroadcastReceiver extends BroadcastReceiver { final String LOG_TAG = this.getClass().getName(); @Override public void onReceive(Context ctx, Intent intent) { if (intent.getAction().startsWith("action_play:")){ Intent playIntent = new Intent(ctx, SoundService.class); playIntent.putExtra(SoundService.SOUND, intent.getStringExtra(SoundService.SOUND)); ctx.startService(playIntent); } }
}