Android Developer

화면 자동 꺼짐 없이 항상 화면을 키고 싶을 때

졸려질려 2022. 11. 3. 16:41
반응형

 Android App 뿐만 아니라, 화면을 보여주는 전자 제품들의 대부분은 디스플레이 출력에서 많은 전력을 소모한다. 심지어 Android App 은 적은 배터리 용량으로 돌아가기 때문에, 배터리 효율을 위해서 디스플레이가 자동으로 꺼지도록 설정이 되어있다. 하지만, 앱을 개발하다보면 디스플레이가 자동으로 꺼지지 않도록 하고 싶은 경우가 존재한다. 예를 들어, 영화나 동영상 감상을 할 때나, 어떤 작업을 하다가도 생각할 시간이 자주 필요한 상황이다. 그럴 때는 Android Device 가 Awake 상태를 유지하도록 해줘야한다.

출처 : https://developer.android.com/training/scheduling/wakelock


1. 대안책

1-1) DownloadManager

 만약 앱이 장시간의 HTTP 다운로드 작업을 해야 한다면, DownloadManager 를 사용한다.

1-2) Sync Adapter

 만약 앱이 외부 서버의 데이터와 동기화 작업을 해야한다면, Sync Adapter 를 사용한다.

1-3) JobScheduler or FCM

 만약 앱이 백그라운드 서비스에 의존하고 있다면, 특정 상황에 서비스를 트리거 할 수 있는 JobSchedulerFCM(Firebase Cloud Messaging) 을 사용한다.

1-4) Companion Device Manager

 만약 주변 범위 안에 Companion Device 가 어디에 있든 Companion 앱을 계속 실행되도록 하고 싶다면, Companion Device Manager 를 사용한다.


2. Keep the Screen On

 영화나 게임 앱에서는 동작이 멈췄다고 해서 화면이 꺼지면 상당한 불편함을 초래할 수 있다. 그럴 때는 "FLAG_KEEP_SCREEN_ON" 플래그를 Activity 에 적용하여 해결할 수 있다. 단, Activity 외에 Service 나 App Componenet 에서는 사용하면 안된다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

 간단하다. window 객체에서 addFlags() 메소드를 통해 FLAG_KEEP_SCREEN_ON 을 적용시켜주면 된다. 이렇게 설정을 하면, Wake Lock 과 다르게 특별히 필요한 권한 요청도 없다. 그리고, 플랫폼이 알아서 관리해주기 때문에 FLAG 를 클리어 시켜야하는 걱정도 할 필요가 없다.

 코드가 아니라 XML 파일에서도 적용이 가능하다. "android:keepScreenOn" 속성을 적용시켜서 똑같은 효과를 얻을 수 있다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ...
    android:keepScreenOn="true">
    
    ...
</RelativeLayout>

 android:keepScreenOn="true"FLAG_KEEP_SCREEN_ON 과 동일한 효과를 가진다. 이렇게 특정 Activity 에서 플래그를 설정해주면, 다른 앱으로 이동하거나 다른 Activity 로 이동해도 플래그를 알아서 초기화 시켜주기 때문에 편리하다.

 만약, Activity 내에서 특정 상황에 FLAG_KEEP_SCREEN_ON 를 해제하고 싶다면, clearFlags() 메소드를 사용하여 플래그를 해제할 수 있다.

window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

3. Keep the CPU on

... 추후 정리 예정 ...

반응형