Отменить AlarmManager

У меня есть метод, который устанавливает время, когда я хочу, чтобы сработала сигнализация. В этом методе я также получил кнопку Стоп, которая отменяет сигнал тревоги

                    if(alarmManager != null){
                       alarmManager.cancel(pi);
                    }

Моя проблема в том, что когда я устанавливаю будильник, выхожу из приложения и снова для отмены будильника я получаю нулевой указатель. Я предполагаю, что это потому, что PendingIntent также закрывается, когда я покидаю приложение (устанавливается в ноль).

Как я могу предотвратить это, чтобы я мог отменить будильник?

Вот весь метод:

    @SuppressWarnings("deprecation")
public void setTime(){

    Calendar mcurrentTime = Calendar.getInstance();
    int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
    int minute = mcurrentTime.get(Calendar.MINUTE);

    TimePickerDialog mTimePicker;
    mTimePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() 
        {
            int callCount = 0;   //To track number of calls to onTimeSet()
            @Override
            public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) 
            {
                 if(callCount == 1)    // On second call
                 {
                     String timeString = "";
                     timeString = selectedHour + ":" + selectedMinute + ":00";
                     Log.d("TEST", "Chosen time : "+ timeString);
                     setAlarm(timePicker, selectedHour, selectedMinute);
                 }
                 callCount++;    // Incrementing call count.
            }
        }, hour, minute, true);
        mTimePicker.setButton(DialogInterface.BUTTON_POSITIVE, "Set", mTimePicker);
        mTimePicker.setButton(DialogInterface.BUTTON_NEGATIVE, "Stop", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                if(alarmManager != null){
                    alarmManager.cancel(pi);
                }
            }
        });

        mTimePicker.setTitle(R.string.time);
        mTimePicker.show();
}

1 ответ

Вы можете сохранить данные, которые используются для создания вашего PendingIntent в Bundle, как показано здесь

Поэтому, когда вы снова откроете свое приложение, вы сможете восстановить PendingIntent и отменить сигнал тревоги, если это необходимо.

РЕДАКТИРОВАТЬ: Прежде всего вы должны переопределить onSaveInstanceState и сохраните данные, которые используются для создания вашего объекта PendingIntent, как показано ниже:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the pending intent id
    savedInstanceState.putInt(PENDING_INTENT_ID, mPendingIntentId);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

После этого в вашем onCreate Метод, который вы будете проверять, если в значении saveInstanceState не указано null Если не ноль, восстановите элементы из объекта saveInstanceState (Bundle), как это

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mPendingIntentId = savedInstanceState.getInt(PENDING_INTENT_ID);
    } else {
        // Probably initialize members with default values for a new instance
        mPendingIntentId = YOUR_DEFAULT_INT_VALUE;
    }
    mPendingIntent = PendingIntent.getBroadcast(this, mPendingIntentId, YOUR_INTENT, PendindIntent.FLAG_UPDATE_CURRENT);
}

PendingIntent будет создаваться заново каждый раз, когда вы входите в свое приложение, поэтому вы сможете отменить тот же сигнал тревоги, который был активирован на предыдущем шаге.

РЕДАКТИРОВАТЬ 2: Другой подход в вашем случае заключается в том, что, поскольку у вас есть только один сигнал тревоги, и его идентификатор всегда одинаков (что следует использовать для requestId PendingIntent), вы можете просто воссоздать PendingIntent всякий раз, когда вы хотите добавить или отменить сигнализация. Метод, подобный приведенному ниже, поможет вам.

private PendingIntent getPendingIntent(Context context){
    return PendingIntent.getBroadcast(context, 0, new Intent(context, YourBroadcastReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT);
}
Другие вопросы по тегам