AlarmService가 제대로 작동합니다. 다만 문제점이 있습니다.

조회수 1471회

AlarmService가 제대로 작동합니다. 다만 문제점이 있습니다.

PendingIntent sender = PendingIntent.getBroadcast(LoginActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000, 60 * 1000, sender);

위와같이 alarmservice를 등록해놓고 사용중입니다.

재부팅을 하여도 재대로 작동하고 activity를 종료한후 핸드폰을 켜둔 상태에서는 alarm이 제대로 작동하는것을 확인하였습니다.

하지만 핸도폰을 장시간 화면을 꺼두거나 alarmservice를 많이 사용할시에 alarm이 더이상 울리지 않습니다.

이것을 확인해본 방법은 alarm이 울릴때마다 Firebase에 시간을 등록해두도록 설정을 해놓았는데 1분마다 재대로 작동을 하다가 어느순간부터 값이 잘 들어오지 않습니다.

이유를 찾아보니마쉬멜로 이상버전에서는 오랜시간 사용하지 않을시 doz mode에 들어가기 때문에 일어나는 현상으로 추측하고 있습니다.

참고로 targetsdkversion은 22입니다.

자그마한 도움이라도 감사히 받겠습니다. 감사합니다.

1 답변

  • 마시멜로우부터 도즈모드가 추가되었습니다. 여러 제한사항들 중 알람에 관한것이 있습니다.

    "AlarmManager 클래스로 일정이 예약된 알람이 비활성화됩니다. 다만 setAlarmClock() 메서드 및setAndAllowWhileIdle()로 설정한 알람은 예외입니다."

    adb 터미널을 통해 에뮬레이터를 doz 모드로 진입시킬 수 있습니다.

    1. 다음 명령어를 통해 배터리가 충전되지 않도록 변경 합니다. $ adb shell dumpsys battery unplug
    2. 디바이스 스크린을 끕니다.
    3. 다음 명령어를 반복 실행 하여, 디바이스 상태가 idle이 되도록 합니다. $ adb shell dumpsys deviceidle step
    4. 화면을 켜거나, 디바이스를 크게 움직이면 Doze 모드에서 빠져나옵니다.
    5. 다음 명령어를 통해 배터리 충전 상태를 원래되로 되돌릴 수 있습니다. $ adb shell dumpsys battery reset
    6. 다음 명령을 통해, 현재 디바이스의 상태를 확인 할 수 있습니다. $ adb shell dumpsys deviceidle
    7. 한방에 하기 adb shell dumpsys deviceidle enable adb shell dumpsys deviceidle force-idle

    위와 같은 방법으로 에뮬레이터를 도즈모드로 진입시키고 알람을 확인해보세요.

    이를 피하기 위해서는 아래 나와있는 코드를 작성해야합니다. 제가 작성한 예제 코드는 아래와 같습니다.

        // 알람 매니저, 인텐트등 설정 후
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + intervalTime, repeatPendingIntent);
        } else {
            alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + intervalTime, repeatPendingIntent);
        }
    

    저는 알람 리피트를 사용하지 않고 무조건 한번의 알람을 울리고 알람이 울리면 브로드 캐스트 리시버에서 "한번의 알람을 다시 셋팅"해둡니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 정말 많은 도움이 되었습니다 ! 각각의 조언들을 모두 반영해보고 오겠습니다! 정성엽 2018.5.10 12:19
    • 잘 되나요? 알 수 없는 사용자 2018.5.14 15:15

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)