4

API21에이 새로운 new AlarmManager.setAlarmClock(...) method이 있으며, 새 알람을 설정하고 상태 표시 줄 알람 아이콘을 표시합니다.안드로이드 AlarmManager.setAlarmClock()을 취소하는 방법

나는 이런 식으로 그것을 사용 :

am.cancel(PendingIntent.getBroadcast(context, 0, new Intent(ALARM_ALERT_ACTION), PendingIntent.FLAG_CANCEL_CURRENT)); 

알람 자체를 :

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(ALARM_ALERT_ACTION); 
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
am.setAlarmClock(new AlarmManager.AlarmClockInfo(time, sender), sender); 

문제는이 코드가 작동하지 않기 때문에 나는이 알람을 취소하는 방법을 모르는 것입니다 (내 BroadcastReceiver의 onReceive가 호출되지 않음) 상태 표시 줄 경보 아이콘이 계속 표시되며 AlarmManager.getNextAlarmClock()도이 경보를 반환합니다.

+0

'cancel()'호출에서'PendingIntent.FLAG_CANCEL_CURRENT'를 제거해보십시오. – CommonsWare

+0

@CommonsWare That works :) 대단히 감사합니다! – Smuggler

+0

@CommonsWare @Smuggler'PendingIntent.FLAG_CANCEL_CURRENT'을 어떻게 제거 할 수 있습니까? 이는 선택적 매개 변수가 아닙니다. – AVEbrahimi

답변

11

PendingIntent.FLAG_CANCEL_CURRENT은 "현재 취소 : PendingIntent"이라고 말합니다. 당신이 cancel()에 갈 때 그것은 AlarmManager을 혼란스럽게하고, 혼란스러운 AlarmManager은 결코 좋은 일이 아닙니다.

명확한 이유가있을 때만 PendingIntent.FLAG_CANCEL_CURRENT을 사용하십시오. 기본값으로 사용하지 마십시오. "오, 문자를 많이 입력하는 것이 좋기 때문에 0 대신이 값을 사용합니다."값을 사용하십시오. :-)

+0

또한, 두 가지 용도로 동일한 PendingIntent'sender'를 사용하면 제대로 작동하지 않을 수 있습니다. 'AlarmClockInfo' 생성자의'showIntent' 인수는 사용자가 알림 창이나 잠금 화면에서 알람 시계 정보를 누를 때 수행 할 작업을 알려줍니다. 'setAlarmClock()'의'operation' 인자는 알람이 "꺼짐"일 때 무엇을해야하는지 AlarmManager에게 알려줍니다. 아마 당신은'cancel()'에 후자를 전달해야합니다. – Jerry101

+0

@CommonsWare,'PendingIntent.FLAG_NO_CREATE'는'AlarmManager.AlarmClockInfo'와'setAlarmClock' 둘 다 작동합니까? – Vyacheslav

+0

@Vyacheslav :'FLAG_NO_CREATE'는'AlarmManager'의 어떤 것과도 관련이 없습니다. 나는 당신이 당신의 관심사가 무엇인지 정확하게 설명하는 새로운 Stack Overflow 질문을하는 것이 좋습니다. – CommonsWare