Develop/Android

[Android] - 코드로 기기 화면 켜지게 하기

Linitial 2022. 10. 18. 14:00
반응형

포스팅 환경

  • M1 Mac OS Monterey 12.6
  • Android Studio Dolphin 2021.3.1 Patch1 (ARM)
  • Gradle 7.4
  • Android Build Gradle 7.3.1
  • Kolin 1.7.20
  • Target SDK 32

보통 안드로이드 디바이스 화면을 깨우는 기능이 필요한 일이 흔하지 않은데

 

저는 FCM 을 구현하던 중에 푸쉬를 받았을 때 화면이 켜져야 할 코드가 필요했습니다.

 

여러 코드가 있지만 저는 아래 코드를 사용하였는데요

 

이 코드를 알려드리겠습니다.

 

 

안드로이드 디바이스 화면을 깨우는 코드는 생각보다 간단합니다.

 

바로 아래의 코드인데요

fun wakeUpScreen() {
    val pm = getSystemService(POWER_SERVICE) as? PowerManager
    pm?.let { _pm ->
        if (!pm.isInteractive) {
            val wLock = pm.newWakeLock(
                PowerManager.SCREEN_DIM_WAKE_LOCK
                        or PowerManager.ACQUIRE_CAUSES_WAKEUP
                        or PowerManager.ON_AFTER_RELEASE,
                "app:Tag"
            )
            wLock.acquire(1000L)
            // wLock.release()
        }
    }
}

 

위 코드에서 중요한 부분은 newWakeLock() 함수에 넣는 파라미터 중에

 

flag 옵션과 이후 호출 해주는 acquire(), release() 함수에 있습니다.

 

 

SCREEN_DIM_WAKE_LOCK

 

화면이 켜지는데 어떤 밝기로 켜질 것 인가? 에 대한 설정을하는 옵션 입니다.

 

이 옵션을 주면 화면이 흐린 밝기로 켜지게 되며 디바이스의 키보드는 백라이트가 꺼진 형태로 표시 됩니다.

 

 

 

ACQUIRE_CAUSES_WAKEUP

 

기기를 깨우는 역할을 하는 플래그입니다. 만약 화면이 켜져 있다면 꺼지지 않고 계속 켜져 있도록 해주는 플래그입니다.

 

 

 

ON_AFTER_RELEASE

 

기기가 깨어나면 좀 더 오래 켜져 있도록 합니다. 아직 켜져 있지 않으면 화면을 켜지 않습니다.

 

 

 

acquire()

 

acquire 함수의 경우 기기를 깨우는 역할을 하는 함수 입니다.

 

acquire() 함수에 long 타입의 milliseconds 시간을 줄 경우.

 

그 milliseconds 의 시간 이후 함수 내부에서 release 함수를 호출하게 됩니다.

 

따라서 따로 release 함수를 호출할 필요가 없습니다.

 

 

 

 

release()

 

release 함수의 경우 acquire 함수를 호출해서 CPU 를 깨운 이후에 필히 호출해야 합니다.

 

그렇지 않으면 앱이 계속 기기의 CPU 를 사용하거나 혹은 스크린이 꺼지지 않아 배터리 소모를 유발할 수 있기 때문입니다.

 

그래서 필히 호출 하여야 합니다.

 

 

 

 

주의할점

 

XXXX_XXX_WAKE_LOCK flag 의 경우 android 4.2(API 17) 부터 디프리케이트 되었지만

 

이 플래그를 넣어주지 않을 경우 Exception 이 발생합니다.

 

그래서 꼭 이 플래그를 함께 넣어줘야 정상적으로 코드가 실행됩니다.

 

java.lang.IllegalArgumentException: Must specify a valid wake lock level.

https://stackoverflow.com/questions/15555630/specify-valid-wake-lock-level

 

specify valid wake lock level

working an an app with GCM support, no problems there. But when I push the notification, the app crashes an LogCat says the following: 03-21 14:32:13.276: E/AndroidRuntime(4457): java.lang.

stackoverflow.com

 

 

이상으로 포스팅을 마치겠습니다.

 

감사합니다. :)

반응형