기기를 켜진 상태로 유지

배터리 소모를 방지하기 위해 유휴 상태인 Android 기기는 빠르게 절전 모드로 전환됩니다. 그러나 애플리케이션이 일부 작업을 완료하기 위해 화면 또는 CPU의 절전 모드를 해제하고 켜진 상태로 유지해야 하는 경우가 있습니다.

사용하는 접근 방식은 앱의 요구사항에 따라 다릅니다. 그러나 일반적으로 일반적인 규칙은 앱이 시스템 리소스에 미치는 영향을 최소화하기 위해 가능한 한 가장 가벼운 접근 방식을 사용하는 것입니다. 다음 섹션에서는 기기의 기본 절전 동작이 앱의 요구사항과 호환되지 않는 경우를 처리하는 방법을 설명합니다.

wake lock 사용의 대안

앱에 wakelock 지원을 추가하기 전에 앱의 사용 사례가 다음 대체 솔루션 중 하나를 지원하는지 고려하세요.

  • 앱이 장기 실행 HTTP 다운로드를 실행한다면 DownloadManager을 사용하는 것이 좋습니다.

  • 앱이 외부 서버의 데이터를 동기화하는 경우 동기화 어댑터를 만드는 것이 좋습니다.

  • 앱이 백그라운드 서비스를 사용하는 경우 JobScheduler 또는 Firebase 클라우드 메시징을 사용하여 특정 간격으로 이러한 서비스를 트리거하는 것이 좋습니다.

  • 호환 기기가 범위 내에 있을 때마다 호환 앱을 계속 실행해야 한다면 호환 기기 관리도구를 사용하세요.

화면을 켜진 상태로 유지

게임이나 영화 앱 같은 특정 앱은 화면이 켜진 상태를 유지해야 합니다. 가장 좋은 방법은 활동에서 FLAG_KEEP_SCREEN_ON를 사용하는 것입니다 (활동에서만 사용하고 서비스나 다른 앱 구성요소에는 절대 사용하지 않음). 예:

Kotlin

class MainActivity : Activity() {

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

Java

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}

이 접근 방식의 장점은 CPU를 켜진 상태로 유지에서 설명한 wake lock과 달리 특별한 권한이 필요하지 않고, 앱이 사용하지 않는 리소스를 해제할 필요 없이 사용자가 애플리케이션 간에 이동할 수 있도록 플랫폼에서 올바르게 관리한다는 점입니다.

애플리케이션의 레이아웃 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를 사용하는 것과 같습니다. 앱에 가장 적합한 접근 방식을 사용할 수 있습니다. 활동에서 프로그래매틱 방식으로 플래그를 설정하면 나중에 프로그래매틱 방식으로 플래그를 삭제하여 화면이 꺼질 수 있다는 장점이 있습니다.

TV 대기 모드

TV에서 FLAG_KEEP_SCREEN_ON를 사용하여 활성 동영상이 재생되는 동안 기기가 대기 모드로 전환되지 않도록 해야 합니다. 포그라운드 활동에서 FLAG_KEEP_SCREEN_ON를 설정하지 않으면 기기는 일정 시간 동안 활동이 없으면 자동으로 대기 모드로 전환됩니다.

CPU가 켜진 상태를 유지

기기가 절전 모드로 전환되기 전에 일부 작업을 완료하기 위해 CPU를 실행 상태로 유지해야 한다면 wake lock이라는 PowerManager 시스템 서비스 기능을 사용하면 됩니다. wake lock을 사용하면 애플리케이션에서 호스트 기기의 전원 상태를 제어할 수 있습니다.

wake lock을 만들고 유지하면 호스트 기기의 배터리 수명에 상당한 영향을 미칠 수 있습니다. 따라서 wake lock은 꼭 필요할 때만 사용하고 가능한 한 짧은 시간 동안 유지해야 합니다. 예를 들어 활동에서 wake lock을 사용할 필요가 없습니다. 위에서 설명한 것처럼 활동에서 화면을 계속 켜 두려면 FLAG_KEEP_SCREEN_ON를 사용합니다.

wake lock을 사용하는 한 가지 적법한 사례로는 화면이 꺼진 상태에서 CPU를 계속 실행하여 작업을 실행하기 위해 wake lock을 사용해야 하는 백그라운드 서비스가 있을 수 있습니다. 하지만 이 방법은 배터리 수명에 미치는 영향 때문에 최소화해야 합니다.

wake lock을 사용하려면 먼저 WAKE_LOCK 권한을 애플리케이션의 매니페스트 파일에 추가해야 합니다.

<uses-permission android:name="android.permission.WAKE_LOCK" />

앱에 서비스를 사용하여 작업을 실행하는 broadcast receiver가 포함된 경우 wake lock을 직접 설정하는 방법은 다음과 같습니다.

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

wake lock을 해제하려면 wakelock.release()를 호출합니다. 이렇게 하면 CPU에 대한 소유권 주장이 취소됩니다. 배터리 소모를 방지하려면 앱에서 wake lock 사용을 바로 종료하는 것이 중요합니다.