상세 컨텐츠

본문 제목

안드로이드 android 개발 와이파이 유지 wifi 절전 모드 관련

스마트기기개발관련/안드로이드 개발

by AlrepondTech 2020. 9. 21. 19:10

본문

반응형

 

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: http://www.androidpub.com/1577204

안녕하세요...

지금 일정한 시간간격으로 서버에 파킷을 전송하고 있습니다.

 

그것을 처음에는 스레드에서 .loop를 돌리고

 

mHandler.sendEmptyMessageDelayed(CHK_KEEPALIVE, KEEPALIVE_TIMEOUT * 1000);

 

이것으로 시간간격으로 이벤트를 발생시켜 파킷을 전송하였는데 폰을 콤에 연결하고 실험하면 서버에 파킷이 제대로 올라 옵니다.

(절전모드이건 상관없이...)

 

그런데 케블을 뽑고 하면 화면이 켜진상태에서는 제대로 파킷이 올라가는데 절전모드상에서는 파킷이 올라오지 않습니다...

 

그리하여 이벤트 문제인가하여 스레드에서 슬립을 주어 파킷을 전송하도록 하였습니다.

 

@Override
 public void run() {
  /*Looper.prepare();
   mHandler.sendEmptyMessageDelayed(CHK_KEEPALIVE, KEEPALIVE_TIMEOUT * 1000);
  mLoop = Looper.myLooper();
  Looper.loop();*/


  int keepTime = 0;
  while(!bExit)
  {
     Log.e("Send Keep Alive", "Keep Alive");
     sendKeepAlive();
   }
   try {
    Thread.sleep(SEND_TIMEOUT * 1000);
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
  }
 }

 

그런데도 절전모드에서는 파킷이 전송되지 않았습니다.

 

절전모드에서 깨여나면 파킷이 전송되고....

 

이것이 절전모드에서 스레드가 suspend되는것일가요 아니면 파킷 전송이 않되는것입니까?(Udp소켓입니다)

 

그리고 절전모드에서 이벤트를 일으키면 사건이 먹지 않는가요?

 

mHandler.sendEmptyMessageDelayed(CHK_KEEPALIVE, KEEPALIVE_TIMEOUT * 1000);

 

이것때문에 고심이 많아요....

 

꼭 답변 부탁드립니다....

 

------------------------------------

 

 

절전모드가   뭘까요? 

 

 

말그대로  전류소모를 줄이기 위해서 모드 인데요. 

APP 이 돌고 있으면  절전모드가  소용이 없겠지요.  

 

절전모드에서 APP 수행이 정지되는 것은 정상이구요. 

 

APP에서  절전모드를 못 들어가게 막을 수는 있습니다.  (꼭 필요한 것이라면...)

 

WakeLock 으로  찾아보세요. 

2011.06.04 11:48:29

정적

빠른답변에 감사드립니다...

이제 볼게요...

2011.06.04 12:19:12

정적

PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
  PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "cpu wake");
  wl.acquire();

 

이렇게 하였는데 여전히 않되네요...ㅠㅠㅠ

 

좀더 자세히 가르쳐 주세요..

 

그리고 이것은 특정어플에 해당한것이나요 아니면 다른어플들에도 다 영향이 가나요....

2011.06.04 14:42:08

정적

WakeLock를 쓰지않고 하는 방식은 없을가요?

 

절전모드시 무조건 스레드가 멈춰서나요?

2011.06.05 12:04:35

zgundam

절전모드는 말 그대로 폰이 돌아가야 하는데 있어 필수적인 기능을 제외한 나머지 기능은 정지되는겁니다..사용자가 설치한 앱은 그 순위에서 젤 나중으로 밀리는거죠..만드는 앱의 성격이 어떤건지를 몰라서 말씀드리긴 어렵습니다만..폰이 절전모드였을때 동작을 안하면 사용자에게 큰 문제가 발생하는 그런 앱이 아니라면 그건 내비두는게 맞다 봅니다..

2011.06.08 17:19:04

정적

구현하려고 하는것이 서버에서 클라이언트에 통지메세지를 전송하려고 합니다.

그런데 절전모드로 들어가면서 파킷을 받는 스레드가 멈추다나니 동작을 하지 못합니다.

이부분 어떻게 해야할지 도움주세요.

 

2011.06.14 14:13:11

스마트전

서버푸쉬 하는 기능인가요?

 

저도 비슷한거 만들었었는데 처음에 쓰레드 했다가 문제가 많아서 알람으로 기능을 바꿨어요

 

알람은 절전모드랑 상관없이 될듯한데

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: http://drcarter.tistory.com/99

 

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


이렇게 하면 됩니다.

이 두가지를 유지시켜 준다면, 백그라운드로 실행을 하면서 대기 모드로 전환이 된다고 해도, 해당 어플이 죽거나 하는 일은 없겠지만, 그만큼 배터리 소모가 많아지기 때문에 안드로이드폰을 오래 사용할 수는 없겠지요. 

 

 

 

=======================

=======================

=======================

 

 


출처: http://blog.naver.com/PostView.nhn?blogId=davincigo&logNo=60137633079

 

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


이렇게 하면 됩니다.

이 두가지를 유지시켜 준다면, 백그라운드로 실행을 하면서 대기 모드로 전환이 된다고 해도, 해당 어플이 죽거나 하는 일은 없겠지만, 그만큼 배터리 소모가 많아지기 때문에 안드로이드폰을 오래 사용할 수는 없겠지요. 

 

 

출처 : http://drcarter.tistory.com/entry/Android-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B0%9C%EB%B0%9C-%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%8B%A4%ED%96%89%EC%8B%9C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90

[출처] 안드로이드 wifi 유지 시키는 법|작성자 다빈

 

 

 

=======================

=======================

=======================

 

 

 

반응형

 

728x90

 

 

 

 

출처: http://www.androidpub.com/529602

Wifi Sleep Policy(절전 정책)과 배터리 소모량 사이의 관계

에이형물고기

http://www.androidpub.com/529602

2010.07.12 15:37:27

영어로는 "Wifi Sleep Policy", 한국말로는 "Wifi 절전 정책"이라고 하는 설정은
다들 아시다시피 기기가 대기상태(액정은 꺼져있지만 전원은 켜져있는 상태)일 때
일정 시간이 지나면 와이파이를 자동으로 꺼지도록 할 수 있는 설정입니다.

한국말 번역이 보여주는 것처럼 이 기능은 기본적으로 대기상태에서의 배터리 소모량을 줄여주기 위해 고안된 것이고,
HTC Korea 공식 사이트에도 해당 기능에 대하여 다음과 같이 설명하고 있습니다:

"최적 배터리 성능을 위해 가능한 짧은 시간 제한 옵션을 사용하십시오. 절전 모드로 전환 안 함 옵션은 되도록 설정하지 마십시오. 이 옵션은 배터리를 빨리 소모하고 화면에 영구적인이미지가 남을 위험이 있습니다." [원문 링크]

하지만 저는 언젠가 인터넷을 돌아다니다가
이 기능과 관련하여 반대의 의견을 펴는 글을 보게 되었습니다.
예전에 한번 네이버 스마트폰 카페(bjphone)에도 올린적이 있었어서, 그때 제가 썼던 글을 다시 아래에 붙여보겠습니다.

=== 발췌 시작 ===

일반적으로 WIfi Sleep Policy의 유용성에 대해서
폰이 꺼져있을 때 같이 꺼지게 함으로써 배터리 소모를 줄인다고 알고 있는데,
이에 대해서 좀 다른 견해를 읽어서 어떻게 생각하시는지 궁금해서 여쭤봅니다.

(원문주소: http://www.androidcentral.com/keeping-your-charge-how-improve-battery-life-your-android-phone)

이 아티클에서 "WiFi, 3G, and how it affects things" 라는 소제목에 해당하는 부분에서,

일단 제일 중요한 부분을 발췌하면,
"Pick Wi-Fi sleep policy, and set it to Never.  Yep, this sounds like it would use MORE battery, but it won't.  When WiFi is on, 3G is off.  When your screen is off, and WiFi is set to shut down, 3G has to kick in to get notifications, check mail, etc.  Leaving WiFi on while the screen is off keeps the power hungry 3G radio off and forces it to behave."

그리고 이와 관련된 내용으로,
"The second biggest battery killer (after the screen), and the one most apt to cause battery life problems is the 3G radio in your phone.  Looking at the sky and determining which signal to lock on to, and when to switch, is a huge drain on your battery.  You can test this yourself.  Spend a day outside doing some drinking doing some healthy activities and check your battery life.  The next day, spend it inside your cube at work, or deep in your basement where the signal sucks.  Your battery life suffers. A lot. Believe it or not, the WiFi radio uses a lot less battery. A big part of this is the way it locks on to a signal and doesn't switch until it's told to, or the signal degrades enough that a proper connection can't be maintained"


요약하자면,

와이파이와 비교해보았을 때, 3G는 계속해서 좋은 접속을 유지하기위해 깨방정을 떠는 관계로
더 많은 배터리를 소모한다. 따라서 Sleep Policy를 통해 와이파이를 끄게 되면,
그리고 그 시간동안 자동 업데이트가 이루어지는 것이 있다면 이때 3G가 사용되고, 
따라서 오히려 더 많은 배터리를 소모하게 된다.

...라는 골자의 주장인것 같습니다.

=== 발췌 끝 ===


며칠전 이 문제가 다시 떠올라서 다시 구글링을 좀 해봤는데,
이번에 찾은 의견들의 요지는 이랬습니다 ---
"3G가 깨방정을 떨게 놔두느니 와이파이가 계속 켜져있게 하는게 전력 소모가 적다는 것은 맞다.
하지만 이것은 와이파이가 안정적으로 잡히는 장소에 한한 얘기다. 그렇기 때문에 나는
Wifi 절전 정책을 '전환 안 함'(Never)로 해놓고, 집에서 나갈 땐 수동으로 와이파이를 차단한다." 

와이파이가 안정적으로 잡히는 곳의 가장 흔한 예는 직접 설치한 무선 공유기가 있는 자신의 집이 되겠죠.
반대로, 만약 Wifi 신호가 불안정해서 Wifi 역시도 신호를 잡기 위해 깨방정을 떨게 되면
절전 정책을 "Never"로 설정함으로써 배터리 소모를 낮춘다는 명제는 거짓이 됩니다.
(게다가 백그라운드에서 자동으로 데이타 송수신이 가능하게 해놓았다면,
와이파이가 꺼지면서 3G 데이타를 사용하게 되는 문제도 있습니다. 물론 많은 경우 그리 큰 용량은 아닙니다만.)

사실 이게 뭐 대단한 문제는 아닐 수도 있습니다.
와이파이가 안정적으로 잡히는 곳이라면 충전이 용이한 곳일 확률도 높고 (집, 사무실 등)
그러면 배터리가 얼마나 닳든 크게 중요한건 아니죠.
다만, '절전 정책을 15분 후로 설정해두는 것이 언제나 절전에 도움이 되는 것은 아니다'라는 의견이
얼마나 타당한 것인지를 다른 분들에게도 한 번 여쭤보고 싶었습니다.

 

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: http://www.androidpub.com/1869205

wi-fi 절전모드를 끄는 소스코드는 없을까요? 해결[3]

Skarz

http://www.androidpub.com/1869205

2011.12.01 18:25:36

1247

3

앱개발 질문

안녕하세요. 

추운 겨울임에도 

 

지금 어플을 wifi용으로 제작중에 있는데요..

절전모드가 켜진 폰의 경우 제대로 되먹질 않네요 ㅠㅠㅠ.

 

절전모드가 될경우 udp는 완전 받지를 않더라구요..

tcp는 가끔 받아가긴 하던데...

 

wi-fi절전모드를 끄는 소스코드를 찾고 있는데..

솔직히 불가능일꺼라 생각되지만 그래도 혹시나 몰라서 

이렇게 올려봅니다..^^..

 

휴대폰의 대기모드를 없애는 식으로 파워매니져를 키면 될꺼같은데

기능중에 근접센서로 화면을 껏다 켰다도 해볼생각이여서..

 

왠지 고민중에 있습니다.......

wifi 절전만 딱 끄면 좋겠는데 말이죠.. 

 

목록

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=1869205&act=trackback&key=ec8

 

2011.12.01 18:56:22

바야바절전모드가 와이파이 통신에도 영향을 미치는지 몰랐네요. 답글이 달리면 저도 도움 좀 받겠습니다.

2011.12.01 19:51:54

레미_21

(추천: 1 / 0)

와이파이 상세설정에 있는 와이파이 슬립모드 설정 이야기라면

Settings.System.putInt(getContentResolver(), Settings.System.WIFI_SLEEP_POLICY, "원하시는 설정");

 

으로 설정 가능하답니다 :)

2011.12.07 09:49:01

Skarz

레미_21님 감사합니다 :D

 

웹에서 왜이리도 찾기 어려운 내용이였던지..

다들 바탕화면에서 메뉴를 눌러서 Wifi설정으로 가라라는 말밖에 없고.. ㅋㅋㅋ

 

감사합니다.~

-------------------------------------------------------------------------

이글을 추후에 보실 분들을 위해 남겨 놓습니다.

Wifi 설정값들 링크 : http://developer.android.com/reference/android/provider/Settings.System.html#WIFI_SLEEP_POLICY

putInt와 putString을 적절히 나눠써야됨.

import android.content.ContentResolver;
public class WifiSleepPolicyManager {
    ContentResolver myCr = null;
    public WifiSleepPolicyManager(ContentResolver cr) {
        myCr = cr;
    }
    public boolean setPolycy(String thisPolicy) {
        if (myCr != null) {
            returnandroid.provider.Settings.System.putString(myCr, android.provider.Settings.System.WIFI_SLEEP_POLICY, thisPolicy);
        }
        return false;
    }
}

소스 참고 '-'/

 

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

퍼미션 참고 ' -'//

 

Wifi를 건들임에도 불구하고 Setting값 조절이기때문에 Wifi 퍼미션은 주지 않습니다.

 

 

 

=======================

=======================

=======================

 

 

 

 

출처: http://curv.tistory.com/185

 

절전 모드로 인하여 wifi 가 꺼지는 것을 방지하기 위해

 

wifiLock 과 wakeLock 을 등록한다.

 

wifiLock 는 말그대로 wifi 상태만 유지

 

wakeLock 는 cpu 상태를 유지하기 위해 사용하였다.

 

wakeLock 의 FLAG 에는 아래와 같이 6가지가 존재한다.

 
매니패스트에는 아래 퍼미션을 추가

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

 

PARTIAL_WAKE_LOCK : CPU ON, 화면은 꺼짐, 키보드 꺼짐

SCREEN_DIM_WAKE : CPU ON, 화면 어둡게, 키보드 꺼짐

SCREEN_BRIGHT_WAKE_LOCK : CPU ON, 화면 밝게, 키보드 꺼짐

FULL_WAKE_LOCK : CPU ON, 화면 밝게, 키보드 ON

 

추가가 가능하나 PARTIAL_WAKE_LOCK 과는 같이 써도 소용 없는 FLAG 2개

ACQUIRE_CAUSES_WAKEUP : acquire 할 때 스크린과 키보드를 켜줌으로써 중요한 통지(notification)이

왔을 때 사용자가 화면을 바로 볼 수 있도록 함.

ON_AFTER_RELEASE : WakeLock 이 릴리즈 되었을 때 유저 액티버티 타이머가 리셋 되어지고 스크린을 좀더 오래 켤 수 있고, wake lock 을 반복적으로 수행하는 사이에 발생하는 깜빡임 현상을 줄이고자 할 때 사용.

 

샘플 :

 

 WifiLock wifiLock = null;
 WakeLock wakeLock = null;

 public void changeToWakeMode() {

  if (wifiLock == null) {
   WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);
   wifiLock = wifiManager.createWifiLock("wifilock");
   wifiLock.setReferenceCounted(true);
   wifiLock.acquire();
  }

  if (wakeLock == null) {
   PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
   wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "wakelock");
   wakeLock.acquire();
  }
 }

 @Override
 public void onStop() {

  if (wifiLock != null) {
   wifiLock.release();
   wifiLock = null;
  }

  if (wakeLock != null) {
   wakeLock.release();
   wakeLock = null;
  }
  
  super.onStop();
 }

 

 

 

=======================

=======================

=======================

 

 

 

 

참고 :

http://eddykudo.com/64

http://2-up.tistory.com/713

http://developer.android.com/reference/android/os/PowerManager.html

http://developer.android.com/reference/android/os/PowerManager.WakeLock.html

 

 

=======================

=======================

=======================

 

 

반응형


관련글 더보기

댓글 영역