Отменить 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);
}