我遇到了同样的问题,但是挂起的意图在 5 秒后启动,而不是我尝试设置的 2 秒。
alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2 * 1000, pIntent);
如果我设置5秒或更长时间,alarmManager
准确地开始。我不知道在生产环境中我会得到什么严格的间隔,所以我选择 1 分钟作为短时间间隔。
所以,我的应用程序使用了postDelayed()
代替AlarmManager
对于短时间间隔,并且AlarmManager
很长一段时间。
代码示例:
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
- 具有声音播放功能的服务,delay
- 播放前的延迟(以秒为单位),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);
}
}
}