Alarmmanager не вызывает Pendingintent всегда - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь создать приложение тревоги, которое запускает событие в определенное время. он показывает тревогу 3 раза за определенное время. после показа 3 раза останавливается. вот мой класс установщика тревоги.

public class AlarmUtil {
private Context context;
private Intent intent;

public AlarmUtil(Context context) {
    this.context = context;
    intent = new Intent(context, AlarmReceiver.class);
}

private void setAlarm(long time, int alarmId){
    Log.d("alarmUtils" , "setAlarm: " + time);
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);


    PendingIntent pendingIntent = PendingIntent.getBroadcast(context , alarmId , intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pendingIntent);
    }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);
    }
}


public void cancelAlarm(int alarmID){
    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, alarmID, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    manager.cancel(pendingIntent);
}

public void setSnoozeAlarm(int alarmID , long time , int snoozeCounter){
    intent = new Intent(context, AlarmReceiver.class);
    intent.putExtra(ValueConstants.ALARM_ID, alarmID);
    intent.putExtra(ValueConstants.SNOOZE_COUNTER, snoozeCounter + 1);
    setAlarm(time, alarmID);
}

public void alarmSetter(AlarmDB alarmDB){
    intent.putExtra(ValueConstants.ALARM_ID, alarmDB.getId().intValue());
    intent.putExtra(ValueConstants.SNOOZE_COUNTER, 0);
    long time = new TimeFormater().amPmtoMillies(alarmDB.alarTime);
    setAlarm(time, alarmDB.getId().intValue());
}

}

Манифест разрешений для тревоги:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SET_ALARM" />

код получателя:

<receiver android:name=".receivers.AlarmReceiver"
        android:enabled="true"/>

вот мои коды активности будильника, связанные со следующей настройкой будильника для повтора:

Bundle extras = getIntent().getExtras();
    if (extras!=null){
        alarmID = extras.getInt(ValueConstants.ALARM_ID);
        notificationFlag= extras.getBoolean(ValueConstants.NOTIFICATION_FLAG);
        snoozeCounter = extras.getInt(ValueConstants.SNOOZE_COUNTER);

        Log.d("alarmID" , "alarmActivity " + alarmID);
    }


private void initSnoozeAlarm(){
    AlarmUtil alarmUtil = new AlarmUtil(getApplication());
    alarmUtil.setSnoozeAlarm(alarmID, System.currentTimeMillis()+60000, snoozeCounter);
    Log.d("alarmActivity" , "snoozealarm :" + snoozeCounter + " " +mPrefs.getSnoozeCounter());
    finish();
}

private void cancelSnoozeAlarm(){
    AlarmUtil alarmUtils = new AlarmUtil(this);
    alarmUtils.cancelAlarm(alarmID);
}

//cancel timer so it doesnt set another snoozealarm, set notification flag, cancel notification, set snooze alarm or notify not done
@OnClick(R.id.noBtn)
public void negetiveAnswer() {
    if(countDownTimer != null){
        countDownTimer.cancel();
    }
    notificationFlag = true;
    cancelNotification();
    if (snoozeCounter >= 2){
        notifyNotDone();
        finish();
    } else {
        initSnoozeAlarm();
    }
}

Итак, проблема снова: сигнализация срабатывает впервые. даже если приложение находится в фоновом режиме. но тревога не всегда срабатывает при повторных тревогах. иногда это так. иногда это не так.

...