1

나는 알람을 발생시키고 자하는 시간을 설정하는 메소드를 가지고있다. 이 방법에서는 은 또한AlarmManager 취소

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

내 문제는 내가 알람을 설정할 때, 나는 nullPointer를 얻을 알람을 취소하려면 응용 프로그램에서 가서 다시에 있다는 것입니다 경보를 취소 중지 버튼을 얻었다. 내가 그것을 떠날 때 PendingIntent 또한 닫히기 때문에 짐작할 수 있습니다 (null로 설정).

어떻게하면 알람이 취소 될 수 있습니까?

을 Heres 전체 방법 : 당신은 그래서 당신은 다시 응용 프로그램을 열 때

here를 보여 같은 번들에 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(); 
} 

답변

0

, 당신이 될 것입니다 PendingIntent를 재구성하고 필요한 경우 경보를 취소 할 수 있습니다.

편집 : 당신이 onSaveInstanceState을 무시하고 아래 그림처럼 PendingIntent 객체를 만드는 데 사용되는 데이터를 저장해야합니다 첫째 : 당신의 onCreate 방법으로 그 후

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

, 당신은 savedInstanceState 있는지 확인합니다 null가 아닙니다. null가 아닌 경우, 같은 savedInstanceState (번들) 개체에서 항목을 복원이

@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를 다시 생성 할 수있는 것보다 단 하나의 알람이 있고 ID가 항상 동일합니다 (PendingIntent의 요청 ID에 사용해야 함) 알람을 추가하거나 취소 할 수 있습니다. 아래의 방법과 같은 방법으로 도움이됩니다.

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

이것은 내가 찾고있는 것입니다. 하지만 어떻게 PendingIntent를 savedInstanceState.put에 넣을 수 있습니까? (...); –

+0

번들 자체에 PendingIntent 자체를 넣지 않아도되지만 구성하는 데 사용한 데이터가 필요하지 않습니다. 앱에 여러 개의 알람이 있습니까? –

+0

번호가 하나만 있습니다. –