본문 바로가기
개발/안드로이드

WIFI 대기모드에서 돌아가게 하기

by darksilber 2011. 5. 3.
반응형
 
 

안드로이드 장치의 전원 상태를 조절할 수 있다. 즉 각 장치의 배터리 소모에 영향을 미치므로 hw lock을 얻은 후엔 release를 확실히 해야 한다.

Power Manager support

Screen on/off

Screen backlight on/off

keyboard backlight on/off

button backlight on/off

adjust screen brightness

Not supported

sleep, standby

Power Manager steps

Activity mContext = this;

//Get a handle to the PowerManager
PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);

//Create a WakeLock and specify the power managerment flag
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE,
“MyTag”);

//Acquire a wake lock
wl.acquire();
//Perform operations (play MP3, open HTML page, etc.)
wl.release();

WakeLock flags

PowerManager.WakeLock 의 WakeLock을 통해

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
  • These flags are mutually exclusive - you may only specify one of them
  • partial wakelock을 유지하는 동안 CPU는 계속 run상태로 된다. 어떤 타이머타 사용자가 power button을 누르더라도 상태는 유지가 된다. 나머지 wakelock은 CPU가 run상태가 되지만 사용자가 power button을 눌러서 sleep으로 갈수 있다.

screen 에만 적용되는 두 가지 flag가 있고, 다만 PARTIAL_WAKE_LOCK. 와 함께 쓰이면 효과가 없다.

Flag Value Description
ACQUIRE_CAUSES_WAKEUP Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.
ON_AFTER_RELEASE

If this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.

android 대기모드에서 돌아가게 만들기

안드로이드의 특징중에 하나를 꼽는다면 백그라운드 실행이라고 할 수 있겠습니다. 아이폰과 다르게 멀티테스킹이 가능한
안드로이드는 그만큼 활용도가 많다는 것입니다. 하지만 그것에 따른 다른 주의 사항이 있습니다.
그 중에 하나가 바로 wifi모드를 유지하는 것입니다.

안드로이드는 대기 모드로 들어가게 되면 배터리 소모를 줄이기 위해서 wifi를 자동으로 꺼버리게 됩니다. 하지만 무선으로 데이터를 주고 받는 중이거나, 스티리밍을 하고 있는 중간에 대기 상태로 들어가게 되고 자동으로 wifi가 꺼지게 된다면 3G의 무선 데이터 모드로 바뀌게 되겠지요. 그렇게 된다면 3G 데이터의 사용이 많아지게 되고 나중엔 사용자의 요금에 지대한영향을 줄 것으로 생각됩니다.

백그라운드 실행 중에도 wifi 상태를 유지하기 위해서는

android.net.wifi.WifiManager.WifiLock

을 이용해서 wifi상태를 유지시켜줘야 합니다.
자세한 설명음
http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html
이 곳에 가시면 확인할 수 있습니다.

간단히 사용방법을 보게 된다면


WifiManager.WifiLock wifiLock = null;
//등록
if (wifiLock == null) {
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
wifiLock = wifiManager.createWifiLock("wifilock");
wifiLock.setReferenceCounted(true);
wifiLock.acquire();
}
//해제
if (wifiLock != null) {
wifiLock.release();
wifiLock = null;
}

이렇게 하면 됩니다.
대기 상태에서도 wifi를 유지하고 있게 된다면, 배터리 소모가 빠르고 많아진다는 단점이 있지만, 그만큼 3G 데이터를 사용하는것이 적어진다는 것에 대한 장점도 있게 됩니다.

두번째로 주의할 점은, 대기상태가 오래 된다면 cpu의 활동을 정지시켜 버립니다. 이것도 배터리 소모를 줄이기 위한 것이기는 하지만, 단적인 예로 들어서 스트리밍으로 음악을 듣고 있는 중에서 화면을 꺼버린 대기 모드일 경우에 cpu를 정지 시킨다면 음악을 들을 수 없게 되겠지요. 그래서 wifi상태를 유지 시켜주기 위한 WifiLock이 있듯이 cpu상태를 활동상태로 유지시켜주는 WakeLock이 있습니다.

android.os.PowerManager.WakeLock


자세한 설명은
http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
이곳에 가셔서 확인해 볼 수 있습니다


이것을 사용하는 방법은 간단히
PowerManager.WakeLock wakeLock = null;
//등록 if (wakeLock == null) {
 PowerManager powerManager = (PowerManager) context.getSystemService(context.POWER_SERVICE); 
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "wakelock");
wakeLock.acquire(); } 
//해제 if (wakeLock != null) { 
wakeLock.release(); wakeLock = null; }
 
이렇게 하면 됩니다. 이 두가지를 유지시켜 준다면, 백그라운드로 실행을 하면서 대기 모드로 전환이 된다고 해도, 해당 어플이 죽거나 하는 일은 없겠지만, 그만큼 배터리 소모가 많아지기 때문에 안드로이드폰을 오래 사용할 수는 없겠지요.
반응형

댓글