1

특정 날짜에 반복되는 알림을 취소하려고합니다. 따라서 해당 특정 시간에 발생하는 브로드 캐스트 리시버에 설정하여 해당 고유 ID를 통해 반복 알림을 취소합니다. . 알림을 취소하지는 않습니다. 두 가지 기법을 모두 시도해 보았습니다.브로드 캐스트 수신자를 통해 Alram을 취소 할 수 없습니다.

mainActivity의 코드 어디에서 알람을 설정하고 있습니까?

     Log.v("setting range alarm","key range id = " + keyIds[j] + "time = " + RangeTimes[j]); 
        // Setting the alarm for repeating notifications, with different broadcast Receiver (alertIntent). 
         AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
         alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, RangeTimes[j], AlarmManager.INTERVAL_DAY, 
           PendingIntent.getBroadcast(this, keyIds[j], alertIntent, PendingIntent.FLAG_UPDATE_CURRENT)); // for exact repeating THIS 

         Log.v("setting range alarm","key range id = " + keyIds[j] + "Cancel time = " + CancelRangeTimes[j]); 


         // Setting the alarm for cancellin the repeating notifications, with different broadcast Receiver(cancelIntent). 

         cancelIntent.putExtra("CancelID", keyIds[j]); 
         cancelIntent.putExtra("key", pendingIntent); 

         AlarmManager alarmManager1 = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
         alarmManager1.set(AlarmManager.RTC_WAKEUP, CancelRangeTimes[j], 
           PendingIntent.getBroadcast(this, keyIds[j], cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT)); // for exact repeating THIS 

여기는 적절한 시간에 전화가 왔지만 작동하지 않는 취소 방송 수신기입니다.

 @Override 
    public void onReceive(Context context, Intent intent) { 


     String pleaseText = intent.getStringExtra("text"); 
     // Methid # 1 (By getting the Alarm id through intent and trying to cancel on the same id 
/* 
     int cancelReqCode = intent.getIntExtra("CancelID", 0); 
     Log.v("setting the cancel", "inside broadCast reciver " + cancelReqCode); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, cancelReqCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     Log.v("setting the cancel", "inside broadCast reciver " + pendingIntent); 
     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.cancel(pendingIntent); 

*/ 

     // Methid # 2 

     Log.i("okk", "please text insode cancel" + pleaseText); 


     PendingIntent pendingIntent = intent.getParcelableExtra("key"); 
     Log.v("setting the cancel","inside broadCast reciver " + pendingIntent ); 
     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.cancel(pendingIntent); 



    } 

// 아래는 내가 alaram 관리자, alertIntent, CancelIntent 및 보류 텐트를 설정하고있어 mainActvity의 코드입니다. 배열 값을 가져 오는 위치의 코드를 생략하고 여기서는 쓸모가 없으므로 설정했지만 모든 날짜 값은 정확합니다. 이 setAlarm()은 onCreate 메소드에서 호출됩니다.

public class MainActivity extends ActionBarActivity implements AsyncResponse, View.OnClickListener { 

    AlarmManager alarmManager; 
PendingIntent pendingIntent; 



     public void setAlarm1() { 

    long[] RangeTimes = new long[C.getCount()]; 
    long[] CancelRangeTimes = new long[C.getCount()]; 
    String rangeCheck = "false" ; 
    int[] KeyRangeIds = new int[C.getCount()]; 

    Intent alertIntent = new Intent(this, AlertReceiver.class); 
    Intent cancelIntent = new Intent(this, CancelAlarmBroadcastReceiver.class); 

    alertIntent.putExtra("strings", DealTimes); 
    cancelIntent.putExtra("strings", DealTimes); 


    // ------------------------- SETTING ALARM -------------------------------- 


    for (int i = 0; i < UserFoodType.length; i++) { 


     for (int j = 0; j < C.getCount(); j++) { 


       RangeTimes[j] = calendar.getTimeInMillis(); 


       CancelRangeTimes[j] = calendar1.getTimeInMillis(); 

      } 


      if(FoodType[j].equals(UserFoodType[i])) 
      { 

       for (int k = 0; k < UserDealZone.length; k++) { 


        if(DealZone[j].equals(UserDealZone[k])) 
        { 



          Log.v("setting range alarm","key range id = " + keyIds[j] + "time = " + RangeTimes[j]); 

          AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
          alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, RangeTimes[j], AlarmManager.INTERVAL_DAY, 
            PendingIntent.getBroadcast(this, keyIds[j], alertIntent, PendingIntent.FLAG_UPDATE_CURRENT)); // for exact repeating THIS 

          Log.v("setting range alarm","key range id = " + keyIds[j] + "Cancel time = " + CancelRangeTimes[j]); 
          // alertIntent.putExtra("cancelID", keyIds[j]); 

          cancelIntent.putExtra("CancelID", keyIds[j]); 
          cancelIntent.putExtra("key", pendingIntent); 

          AlarmManager alarmManager1 = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
          alarmManager1.set(AlarmManager.RTC_WAKEUP, CancelRangeTimes[j], 
            PendingIntent.getBroadcast(this, keyIds[j], cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT)); // for exact repeating THIS 

      } 

     } 
    } 
+0

리시버를 매니페스트에 추가 했습니까? – Blackkara

+0

@Blackkara 예, 방송 수신자가 정상적으로 작동하지만 알림이 계속 수신되지만 알림이 계속 수신됩니다. –

+0

'alertIntent','cancelIntent' 및'pendingIntent'를 생성하는 곳에서'MainActivity'에 코드를 보여주십시오. 질문을 편집하고이 코드를 추가하십시오. –

답변

0

이 같은 cancelIntent에 추가를 가하고 있습니다 : 그것은 null을 할 수 있도록

cancelIntent.putExtra("key", pendingIntent); 

그러나, pendingIntent가 초기화되지 않습니다. CancelAlarmBroadcastReceiver.onReceive()가 호출

,이 코드 :

PendingIntent pendingIntent = intent.getParcelableExtra("key"); 

아마 null을 반환합니다. 당신은 그것을 로깅하고 있습니다, 당신은 확인할 수 있어야합니다.

어떤 경우에도 pendingIntent이 null이면 AlarmManager.cancel()을 호출해도 아무런 변화가 없습니다.

+0

보류중인 의도가 null이 아니 었습니다. 잘못된 의도를 전달하는 중이었습니다. 이제는 작동하지만이 방향에 대해 감사드립니다. D –

관련 문제