정확한 알람 예약은 기본적으로 거부됨

정확한 알람은 사용자가 의도한 알림이나 정확한 시간에 실행해야 하는 작업을 위한 것입니다.

앱이 정확한 알람을 예약할 수 있도록 Android 12에 도입된 권한인 SCHEDULE_EXACT_ALARMAndroid 13 이상을 타겟팅하는 새로 설치된 대부분의 앱에 더 이상 사전 부여되지 않습니다(기본적으로 거부됨으로 설정됨). 사용자가 백업 및 복원 작업을 통해 Android 14를 실행하는 기기로 앱 데이터를 전송하는 경우에도 권한은 계속 거부됩니다. 기존 앱에 이미 이 권한이 있는 경우 기기가 Android 14로 업그레이드될 때 이 권한이 미리 부여됩니다.

다음 API를 통해 정확한 알람을 시작하려면 SCHEDULE_EXACT_ALARM 권한이 필요하며 권한이 없으면 SecurityException이 발생합니다.

다음을 비롯하여 SCHEDULE_EXACT_ALARM 권한의 기존 권장사항이 계속 적용됩니다.

영향을 받는 앱

기기가 Android 14 이상을 실행하는 경우 이 변경사항은 다음과 같은 특성을 가진 새로 설치된 앱에 영향을 미칩니다.

  • Android 13(API 수준 33) 이상을 타겟팅합니다.
  • 매니페스트에서 SCHEDULE_EXACT_ALARM 권한을 선언합니다.
  • 예외 또는 사전 부여 시나리오에 포함되지 않습니다.
  • 캘린더 또는 알람 시계 앱이 아닙니다.

캘린더 및 알람 시계 앱은 USE_EXACT_ALARM을 선언해야 함

캘린더 또는 알람 시계 앱은 앱이 더 이상 실행되지 않을 때 캘린더 리마인더, 기상 알람 또는 알림을 보내야 합니다. 이러한 앱은 USE_EXACT_ALARM 일반 권한을 요청할 수 있습니다. USE_EXACT_ALARM 권한은 설치 시 부여되며 이 권한이 있는 앱은 SCHEDULE_EXACT_ALARM 권한이 있는 앱과 마찬가지로 정확한 알람을 예약할 수 있습니다.

정확한 알람이 필요하지 않을 수 있는 사용 사례

이제 SCHEDULE_EXACT_ALARM 권한이 기본적으로 거부되고 권한 부여 프로세스에서 사용자가 추가 단계를 실행해야 하므로 개발자는 사용 사례를 평가하고 정확한 알람이 사용 사례에 여전히 필요한지 판단하는 것이 좋습니다.

다음 목록은 정확한 알람이 필요하지 않을 수 있는 일반적인 워크플로를 보여줍니다.

앱의 전체 기간 동안 반복되는 작업 예약
set() 메서드는 내일 오후 2시 또는 30분 후에 출발과 같이 작업에서 실시간 제약 조건을 염두에 두어야 할 때 유용합니다. 그 외의 경우에는 대신 postAtTime() 또는 postDelayed() 메서드를 사용하는 것이 좋습니다.
예약된 백그라운드 작업(예: 앱 업데이트 및 로그 업로드)
WorkManager시간에 민감한 주기적 작업을 예약하는 방법을 제공합니다. 반복 간격과 flexInterval(최소 15분)을 제공하여 작업의 세분화된 런타임을 정의할 수 있습니다.
시스템이 유휴 상태인 동안 대략적인 시간에 울려야 하는 알람
부정확한 알람을 사용합니다. 구체적으로 setAndAllowWhileIdle()을 호출합니다.
특정 시간 후에 발생해야 하는 사용자 지정 작업
부정확한 알람을 사용합니다. 구체적으로 set()을 호출합니다.
특정 시간 내에 발생할 수 있는 사용자 지정 작업
부정확한 알람을 사용합니다. 구체적으로 setWindow()를 호출합니다. 허용되는 최소 시간은 10분입니다.

정확한 알람을 계속 사용하기 위한 이전 단계

정확한 알람을 예약하려면 최소한 먼저 앱에서 권한이 있는지 확인해야 합니다. 앱에 권한이 없는 경우 인텐트를 호출하여 사용자에게 권한을 요청해야 합니다.

이는 특수 권한 요청의 표준 워크플로와 동일합니다.

  1. 앱은 AlarmManager.canScheduleExactAlarms()를 호출하여 적절한 권한이 있는지 확인해야 합니다.
  2. 앱에 권한이 없는 경우 앱의 패키지 이름과 함께 ACTION_REQUEST_SCHEDULE_EXACT_ALARM이 포함된 인텐트를 호출하여 사용자에게 권한을 부여하도록 요청합니다.

    앱의 onResume() 메서드에서 사용자의 결정을 확인합니다.

  3. 사용자가 권한을 부여하면 전송되는 AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED 브로드캐스트를 수신 대기합니다.

  4. 사용자가 앱에 권한을 부여한 경우 앱은 정확한 알람을 설정할 수 있습니다. 사용자가 권한을 거부하면 권한으로 보호되는 정보 없이도 사용자에게 기능을 제공하도록 앱 환경의 성능을 단계적으로 저하합니다.

다음 코드 스니펫은 SCHEDULE_EXACT_ALARM 권한을 확인하는 방법을 보여줍니다.

val alarmManager: AlarmManager = context.getSystemService<AlarmManager>()!!
when {
   // If permission is granted, proceed with scheduling exact alarms.
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // Ask users to go to exact alarm page in system settings.
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

권한을 확인하고 onResume()에서 사용자의 결정을 처리하는 샘플 코드:

override fun onResume() {
   …  
   if (alarmManager.canScheduleExactAlarms()) {
       // Set exact alarms.
       alarmManager.setExact(...)
   }
   else {
       // Permission not yet approved. Display user notice and revert to a fallback  
       // approach.
       alarmManager.setWindow(...)
   }
}

권한 거부 시 단계적으로 성능 저하

일부 사용자는 권한 부여를 거부합니다. 이 시나리오에서는 앱의 환경을 단계적으로 저하하면서도 사용 사례를 식별하여 가능한 최상의 대체 사용자 환경을 제공하기 위해 노력하는 것이 좋습니다.

예외

다음 유형의 앱은 항상 setExact() 또는 setExactAndAllowWhileIdle() 메서드를 호출할 수 있습니다.

  • 플랫폼 인증서로 서명된 앱
  • 권한이 있는 앱
  • 전원 허용 목록에 있는 앱(앱이 요구사항에 부합하는 경우 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 인텐트 작업을 사용하여 요청할 수 있음)

사전 부여

테스트 가이드라인

이 변경사항을 테스트하려면 시스템 설정의 특수 앱 액세스 페이지에서 앱의 알람 및 리마인더 권한을 사용 중지하고(설정 > 앱 > 특수 앱 액세스 > 알람 및 리마인더) 앱의 동작을 관찰합니다.