일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- workmanager
- Background
- schedule
- shceduler
- livedatam
- firebase
- jobschduler
- Android
- Service
- epmty
- 검사
- alarmanager
- PHP
- 빈
- Library
- jobdispatcher
- Job
- Today
- Total
에몽이
powermanager 본문
[Android/안드로이드] PowerManager 를 통해 안드로이드의 진정한 주인이 되어 봅시다. |
1. Information
먼저 Developer 의 내용을 간단히 정리해주세요
- PowerManager 는 Device 의 전원 상태 ( Power state ) 를 제어할 수 있게 도와줍니다.
- 단말의 배터리 사용시간은 PowerManager 의 API 사용에 따라 현저한 차이를 나타냅니다.
- 반드시 필요한 경우가 아니라면 WakeLocks 을 acquire 하지 않는 것이 좋습니다.
- 가능한 낮은 레벨을 사용하고 사용 후에는 반드시 release 하는 것이 좋습니다.
Developer 에서 class 에 대한 소개보다도 주의사항을 더 많이 표시하고 있습니다.
이 말은, 잘만 사용하면 원하는 효과를 볼 수 있지만, 잘못 사용하면 소위 말하는 배터리 조루를 초래할 수 있다는 이야기지요.
사용할 때 주의하셔야 겠습니다.
언제 사용하나요?
안드로이드 시스템은 사용자의 Interaction이 없을 때 화면이나 키보드 조명을 차단하고, Sleep 후 일정 시간이 지나면 WiFi 네트워크도 끊어버리며, CPU 까지도 잠재워버리는 배터리 절약 정책을 가지고 있습니다.
대부분의 앱이 이 System 의 배터리 절약 정책을 따르고 있지만, 이 정책에 협조하지 않아야 하는 App 들도 존재합니다.
먼저 동영상 플레이어가 그 예인데, 배터리가 적다고, 그리고 화면을 터치하지 않는다고 화면을 끄면 안 되겠죠?
마찬가지로 네비게이션이나 DMB 도 User Interaction 이 없다고 화면을 끄면 안되죠.
백그라운드 작업을 하는 앱들은 화면이 꺼지더라도 CPU는 계속 동작해야 합니다.
이러한, 예외적인 경우에는 안드로이드 자체의 배터리 절약 정책을 따를 수 없다고, 공식적으로 표명하고 따르지 않는 방법이 있는데,
그것을 도와주는 것이 PowerManager 와 PowerManager.WakeLock 입니다.
어떻게 사용하나요?
먼저 PowerManager 는 System Service로서 다음과 같이 얻어올 수 있습니다.
PowerManager pm = (PowerManager) getSystemService( Context.POWER_SERVICE );
가장 많이 사용하는 API 는 newWakeLock() 이고 return 값은 PowerManager.WakeLock object 이죠.
이 WakeLock 이라는 object 를 이용하여 power control 을 할 수 있는 것입니다.
PowerManager.WakeLock wakeLock = pm.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK, "MY TAG" );
wakeLock.acquire();
// do something.
// the screen will stay on during this section.
wakeLock.release();
Developer 에 명시되어 있듯이, 구현시에 꼭 필요한 경우가 아니라면 acquire() 하지 않는 것이 좋으며,
사용해야만 할 경우에는 반드시 사용이 끝나자마자 release() 를 해주어야 합니다.
또한 자신이 원하는 구현에서 꼭 필요한 내용만을 담고 있는 "가장 낮은 레벨" 을 사용해야 베터리를 아낄 수 있죠.
레벨 레벨 하시는데, 무슨 레벨들이 있나요?
Flag Value | CPU | Screen | Keyboard |
PARTIAL_WAKE_LOCK | On | Off | Off |
SCREEN_DIM_WAKE_LOCK | On | Dim | Off |
SCREEN_BRIGHT_WAKE_LOCK | On | Bright | Off |
FULL_WAKE_LOCK | On | Bright | Bright |
Flag 들이 영향을 미치는 녀석들은 CPU, Screen, Keyboard (조명) 입니다.
위에 제시된 4개의 Flag 는 "|" 로 중첩하여 사용할 수 없습니다.
PARTIAL_WAKE_LOCK 의 경우 User 가 Power Button 을 눌러 단말을 sleep 시켜도 계속 CPU 가 돌게 되어 있습니다.
다른 녀석들은 Power Button 을 눌러 단말을 sleep 시키면 CPU 가 멈춥니다.
따라서 PARTIAL_WAKE_LOCK 을 acquire() 했을 때는 release() 가 더더더욱 더 중요하게 됩니다.
PARTIAL_WAKE_LOCK 을 제외한 나머지 3개의 Flag 에 대해서는 다음의 Flag를 "|" 로 더하여 사용할 수 있습니다.
Flag Value | Description |
ACQUIRE_CAUSES_WAKE_UP | 보통의 WAKE_LOCK 은 켜진 화면을 계속 유지하게는 하지만, 꺼진 화면을 강제로 켜지는 않습니다. 하지만 이 Flag 가 함께 사용된다면, WakeLock이 acquire() 되는 순간 Screen 과 Keyboard 가 바로 켜집니다. 보통 긴급한 notification (착신전화, 알람) 등이 있을 때 주로 사용됩니다. |
ON_AFTER_RELEASE | 이 Flag 가 설정되면 WakeLock 이 release 된 후 화면 timer를 reset 합니다. 이 때 화면이 꺼지는 시간이 조금 더 길어지기 때문에, WAKE_LOCK 조건을 여러 번 사용할 때 너무 빨리 꺼지지 않게 하여, 화면 깜빡임을 덜어줍니다. |
가장 중요한 뭔가를 놓친 기분이에요..
네. 정확하게 짚어내셨습니다.
이 PowerManager 의 WakeLock 을 사용하기 위해서는
Manifest에 <uses-permission> 을 이용해 android.permission.WAKE_LOCK 의 permission을 부여해야 합니다.
<uses-permission android:name="android.permission.WAKE_LOCK"/>
이게 설정되어 있지 않으면, 다 말짱 꽝입니다.
다른 API 들은 없나요?
왜 없겠습니까? 다음과 같은 API 들을 제공합니다.
이름만 봐도 무슨 기능인지 아시겠죠? 자세한 것은 developer 를 참조하세요.
<PowerManager>
void goToSleep( long time )
boolean isScreenOn()
PowerManager.WakeLock newWakeLock( int flags, String tag )
void reboot( String reason )
void userActivity( long when, boolean noChangeLights )
[goToSleep() 을 사용하기 위해서는..]
더보기
<PowerManager.WakeLock>
void acquire()
void acquire( long timeout )
boolean isHeld()
void release()
void setReferenceCounted( boolean value )
void setWorkSource( WorkSource ws )
String toString()
2. Summary
- PowerManager 는 Device 의 전원 상태를 제어할 수 있도록 도와주는 system service class 이다.
- PowerManager 는 배터리 사용시간을 좌지우지하는 녀석으로 주의해서 사용해야 한다. 반드시
- 필요한 경우가 아니라면 WakeLock 을 acquire 하지 않는 것이 좋으며, acquire 를 했으면, 사용이 끝나자마자 바로 release 해주어야 한다.
- newWakeLock() 의 flag 로 사용할 수 있는 녀석은 총 4가지가 있으며 PARTIAL_WAKE_LOCK 을 제외한 3가지 경우는 2가지 flag 를 추가로 | 로 중첩시킬 수 있다.
- PowerManager 의 WakeLock 을 사용하기 위해서는 android.permission.WAKE_LOCK 을 permission 으로 주어야 한다.
3. References
- http://developer.android.com/reference/android/os/PowerManager.html
Android Developer Doc. PowerManager
- http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
Android Developer Doc. PowerManager.WakeLock
- http://developer.android.com/reference/android/net/wifi/WifiManager.html
Android Developer Doc. WifiManager
- http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
Android Developer Doc. WifiManager.WifiLock
출처: http://aroundck.tistory.com/48 [돼지왕 왕돼지 놀이터]
'android' 카테고리의 다른 글
안드로이드 데이터베이스(DB) 프로그래밍 4. [SQLiteOpenHelper 사용 예제] (Android Database 4) 출처: http://recipes4dev.tistory.com/124 [개발자를 위한 레시피] (0) | 2018.03.05 |
---|---|
Bundle (0) | 2018.02.23 |
sticky Intent 및 sticky BroadCast (0) | 2018.02.22 |
안드로이드/Android String null (0) | 2018.02.20 |
gradle에서 CompileOnly (0) | 2018.02.19 |