0

デバイスがスリープモードにあるときにアラームを起動するという矛盾にこの問題があり (十分に文書化された問題)、それが私を夢中にさせています。

頻繁なリマインダー用のアプリでは、アラームマネージャーを使用して、前のリマインダーが発生したときに次のリマインダーの時間を設定します。ほとんどの場合、アプリは正常に動作しますが、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 固有のものであり、例外として扱うことができるかということです。

4

1 に答える 1