-
[안드로이드]AlarmManager cancel() 안먹힐 때 보세요~Development/Android 2018. 6. 5. 17:41반응형
늘 그렇듯 우리는 알람을 설정할 때에는 이런식으로 합니다. 클래스에서 알람을 생성한뒤 리시버로 전달->서비스에서 실행하죠.
그러나 알람은 여러개를 만들고 상황에 따라 다르게 설정할 경우가 있죠. 그래서 인텐트에 별도로 Action을 설정해주는 경우가 많이 있습니다.
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction(액션1); //액션
PendingIntent pIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, setTime.getTimeInMillis(), pIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, setTime.getTimeInMillis(), pIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, setTime.getTimeInMillis(), pIntent);
}
그리고 취소할 때는 다음과 같이 하죠.
public void cancelAlarm(Context context, int alarmId)
{
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(context, alarmId , intent, 0);
alarmManager.cancel(pIntent);
}
물론 이렇게하면 취소는 될수도, 안될수도 있습니다.
그 원인은 AlarmReceiver에 있으니깐요
저같은 경우 리시버에 다음과 같이 액션 처리를 합니다.
Switch(action)
{
case 액션1 :
알람 단일 실행
break;
case 액션2 :
반복실행
break;
case 액션3 :
알람해제
break;
... 등등
}
이 경우에 위 cancelAlarm() 메소드를 실행하면 알람이 취소되지 않습니다.
저도 여러 뻘짓을 하다가 깨우쳤네요 ㅠㅠ;
cancelAlarm() 내부의 intent를 주목할 필요가 있습니다.
저는 그저 위처럼하면 AlarmReceiver.class가 실행이 안될줄 알았는데 로그를 찍어보니 cancel()을 해도 리시버가 호출이 되더군요.
해당 알람이 울리지 않게 하려면 cancelAlarm()메소드를 다음과 같이 수정해야합니다.
public void cancelAlarm(Context context, int alarmId)
{
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction(액션1);
intent.setAction(액션2);
PendingIntent pIntent = PendingIntent.getBroadcast(context, alarmId , intent, 0);
alarmManager.cancel(pIntent);
}
이렇게하면 액션1, 액션2가 함께 cancel()이 되므로 알람이 작동하지 않습니다.이해되셨나요? ㅎㅎ저처럼 이런 뻘짓을 하지않기를 당부드리며 포스팅을 마칩니다.반응형'Development > Android' 카테고리의 다른 글
[Android]Java 디컴파일하는 법 (0) 2020.07.30 [어플도사] 개인정보처리방침 (0) 2020.07.24 [Android]안드로이드 apk 업로드 오류 (0) 2020.07.24 [안드로이드 스튜디오] 3.1버전에서 DDMS(DeviceMonitor) 열기 (0) 2018.06.22 [안드로이드] 안드로이드 스튜디오 3.1 Configuration~ 경고 제거법 (2) 2018.06.18 [안드로이드]DDMS db에러 100% 해결법 (0) 2018.04.24 [안드로이드] 6.0/7.0 버전에 대응하는 방해금지 권한 허용 (0) 2017.10.24 [안드로이드]커스텀 다이얼로그 해상도 비율에 맞게 크기 조절하기 (0) 2017.09.29 [Android]안드로이드 - 앱을 설치할 수 없음 505에러 뜨는 원인 (0) 2016.12.24 [Android]안드로이드 앱에 SNS공유 기능 넣기(with 라인) (0) 2016.12.23