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
만약 앱이 백그라운드 서비스에 의존하고 있다면, 특정 상황에 서비스를 트리거 할 수 있는 JobScheduler 나 FCM(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
... 추후 정리 예정 ...
'Android Developer' 카테고리의 다른 글
Android TinyDancer 라이브러리 분석 (FPS, 프레임률 측정) (0) | 2022.12.28 |
---|---|
[Android] Duplicate class androidx.lifecycle.ViewModelLazy found... (2) | 2022.11.21 |
Android Vitals 와 Firebase Crashlytics 연동 (0) | 2022.11.02 |
Firebase Console 과 Android App 연동 (0) | 2022.11.02 |
RadarChartView 직접 만들기 : 3. Custom Drawing (0) | 2022.10.14 |