1

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

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

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

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

Heres весь метод:

@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(); 
} 

ответ

0

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

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

EDIT: Прежде всего, вы должны переопределить 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 вы будете проверять, если savedInstanceState не является нулевым. Если не равно нулю, восстановить элементы из объекта savedInstanceState (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 будут воссозданы каждый раз, когда вы будете ввести свое приложение, так что вы сможете отменить ту же тревогу, что было запущено в предыдущий шаг.

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

private PendingIntent getPendingIntent(Context context){ 
    return PendingIntent.getBroadcast(context, 0, new Intent(context, YourBroadcastReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT); 
} 
+0

Это именно то, что я ищу. но как я могу разместить PendingIntent в файле savedInstanceState.put .. (...); Я все еще новичок, когда дело доходит до android. –

+0

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

+0

No. theres только один сигнал тревоги –

Смежные вопросы