デバイスがスリープモードにあるときにアラームを起動するという矛盾にこの問題があり (十分に文書化された問題)、それが私を夢中にさせています。
頻繁なリマインダー用のアプリでは、アラームマネージャーを使用して、前のリマインダーが発生したときに次のリマインダーの時間を設定します。ほとんどの場合、アプリは正常に動作しますが、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);
}
}
私が最初に観察しているのは、アラームのバッチ処理です。これは、想定されたときにアラームが起動されず、次のアラームが 2 番目のアラームと一緒に予定されているときに起動される場合です。
他に、スリープモードでアラームが時間通りに起動しない場合、電源ボタンでデバイスを起動した直後にアラームがオフになります。
API 19 および 23 (居眠りモード) でのアラーム動作の変更を認識しています。setExact() を使用して、エミュレートされた仮想デバイスで観察された新しい API の不正確な問題を解決しました。
このTF300tタブレットとGalaxy S3電話の2つの物理Androidデバイスがあります。S3 ではこの問題はめったに発生しませんが、TF300t の問題の一貫性により、基本的に私のアプリは役に立たなくなります。
だから私の質問は、私が説明した問題がすべての API の多くのデバイスに存在するか (まったく異なる解決策を探す必要があるか)、それともデバイスまたは API 固有のものであり、例外として扱うことができるかということです。