我有这个问题,即设备处于睡眠模式时启动警报不一致(有据可查的问题),这让我发疯。
在我的频繁提醒应用程序中,当上一个提醒发生时,我使用警报管理器设置下一个提醒的时间。在大多数情况下,应用程序运行良好,但在我的 ASUS TF300t (API 17) 上处于睡眠模式时,警报会变得疯狂。
报警注册代码:
Intent i = new Intent(mContext, OnAlarmReceiver.class);
i.putExtra(RReminder.PERIOD_TYPE, type);
i.putExtra(RReminder.EXTEND_COUNT, extendCount);
i.setAction(RReminder.CUSTOM_INTENT_ALARM_PERIOD_END);
pi = PendingIntent.getBroadcast(mContext, (int)when, i, PendingIntent.FLAG_ONE_SHOT);
if(buildNumber >= Build.VERSION_CODES.LOLLIPOP){
AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(when, pi);
mAlarmManager.setAlarmClock(alarmClockInfo,pi);
} else if(buildNumber >= Build.VERSION_CODES.KITKAT){
mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, when, pi);
} else {
mAlarmManager.set(AlarmManager.RTC_WAKEUP, when, pi);
}
还有我的 WakefulBroadcastReceiver 类:
public class OnAlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
int type = intent.getExtras().getInt(RReminder.PERIOD_TYPE);
int extendCount = intent.getExtras().getInt(RReminder.EXTEND_COUNT);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Log.d("period type",""+type);
Log.d("time",sdf.format(Calendar.getInstance().getTime()));
Intent i = new Intent(context, PeriodService.class);
i.putExtra(RReminder.PERIOD_TYPE, type);
i.putExtra(RReminder.EXTEND_COUNT, extendCount);
startWakefulService(context,i);
}
}
我观察到的第一件事是警报批处理,当警报没有按预期启动时,而是在下一个警报与第二个警报一起到期时启动。
另一件事是,当闹钟在睡眠模式下没有按时启动时,它会在我用电源按钮唤醒设备后立即响起。
我知道 API 19 和 23(打盹模式)中警报行为的变化。我使用 setExact() 解决了在模拟虚拟设备中观察到的较新 API 的不精确问题。
我有两个物理 android 设备,这个 TF300t 平板电脑和 Galaxy S3 手机。虽然在 S3 上这个问题很少发生,但 TF300t 上的一致性问题基本上让我的应用程序毫无用处。
所以我的问题是,我所描述的问题是否存在于所有 API 的许多设备上(这需要我寻找完全不同的解决方案),或者它们是设备或 API 特定的并且可以作为例外处理?