알람앱 같이 안드로이드 폰이 잠들어 잠들어 있다가, 일정시간이 되면 앱의 화면이 켜져야 한다면 어떻게 해야할까요?
이 때 사용할 수 있는, 안드로이드 시스템에서 제공해주는 기능으로 wake lock 이라는 것이 있는데요.
오늘은 이것에 관해서 정리해보겠습니다.
1. Permission 선언
제일 먼저 해야할 것은 permission을 선언하는 것입니다.
너무도 다행스러운 것은 동적 permission의 대상은 아니라는 것이네요.
아래와 같이 manifest에 선언해주면 됩니다.
2. Cpu 깨어있도록 하기
사용자의 휴대폰이 Sleep모드로 들어가도, 폰의 CPU가 깨어있다면 일정한 시간에 계산을 해서,
화면을 켜고 소리를 플레이 하는 등의 과업을 수행할 수 있습니다.
이것은 어떻게 하는 것일까요?
Cpu가 깨어있도록 하는 것은, 안드로이드 시스템의 파워매니저로부터 wakeLock을 얻어와야 합니다.
따라서, 파워 매니저를 얻어오기 위해, getSystemService()메소드를 사용하구요.
얻어온 파워매니저 객체에, newWakeLock 메소드를 사용해서 WakeLock객체를 얻어옵니다.
이 때 첫번째 인자로, WakeLock Flag를 받는데요.
어떤 wakeLock모드를 사용할 것인가에 대해서 선택하라는 것이구요.
여기에 사용할 수 있는 주요 Flag들은 아래와 같습니다.
- PARTIAL_WAKE_LOCK
- CPU가 깨어 있도록 하는 것으로, 화면과 키보드 백라이트는 꺼집니다.
- 유저가 파워버튼을 누르면, 화면은 꺼지지만, CPU는 wakeLock이 release되기 전까지 계속 켜져 있습니다.
- ACQUIRE_CAUSES_WAKEUP
- WakeLock을 얻게 되었을 때, 화면을 보여지도록 하는 FLAG입니다.
- ON_AFTER_RELEASE
- WakeLock이 release되었을 때, 화면이 좀 더 켜져있도록 합니다.
(참고로 deprecated된, FULL_WAKE_LOCK Flag등은 제외 하였습니다.
공식문서에서는 WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON을 사용할 것을 권장하고 있네요)
두번째 인자로 들어가는 TAG는 아래와 같이 해당 앱이름을 붙여주라고 권유하고 있습니다.
private static final String WAKELOCK_TAG = "testous:wakelock";
아래코드와 같이 구현할 수 있는데요. 위에서 얻어온 wakeLock객체에 acquire()메소드를 사용해서, WakeLock을 얻어오면 됩니다.
3. WakeLock Release
4. Receiver와 Service에서 사용하기
특정시간에 Service를 동작하게 해야한다고 가정하고,
위에서 만든 WakeLock메소드들을, Reciever와 Service에서 한번 사용해보도록 하겠습니다.
먼저 Receiver에서 CpuWakeLock을 얻어서, service를 실행시킵니다.
Service 클래스에서는, 아래와 같이 onCreate()에서, wakeLock을 얻구요.
onDestroy()에서도 잊지말고, wakeLock을 Release해주어야 배터리 소모를 줄일 수 있습니다.
Receiver와 Service에서 wakeLock을 얻도록 해 보았는데요.
여기에 AlarmManager를 이용해서 세팅하면, 특정시간에 Service가 동작하도록 할 수 있습니다.
참고로 Alarm에 관해서는 아래링크를 참조해주세요.
>>> AlarmManager 로 구현하는 안드로이드 알람 <<<
'Android 개발 > Service, Receiver' 카테고리의 다른 글
Broadcast Receiver 등록하고 시스템 이벤트 받아서 처리하기 (1) | 2023.05.23 |
---|---|
Android Foreground Service 로 Background 에서 음악 플레이 하기 (4) | 2020.01.18 |
부팅 혹은 재 부팅시 실행되는 Android Service 개발 (1) | 2019.05.26 |
BindService 의 생성과 Activity 에서의 Bind (0) | 2017.04.04 |
댓글