Android 개발 절전 해제 방법

우선 안드로이드 6.0이상의 버전부터는 Doze모드라는 새로운 모드가 생겼습니다.

쉽게 말하면 절전모드 같은것입니다.

이 도즈모드라는거에 진입하는 조건은

1. 배터리가 충전중이 아닐것

2. 휴대폰이 제자리에 계속 놓여진 상태일것

3. 화면이 꺼진상태로 일정시간 지속되어있을것

3개의 조건이 된다면 도즈모드에 진입하게됩니다.

이 모드에 진입한다면 각종 백그라운드 서비스가 제한됩니다.

결국 이 도즈모드에 진입을 막기위한 방법을 찾다가 화이트리스트 라는것을 찾았습니다.

이 화이트리스트에 등록을 한다면 도즈모드 대상으로부터 제외됩니다.

화이트모드에 진입하는 시간은 제조사별로 다 다르다고합니다.

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
public void Whitelist_Check(){
        /**
         * 안드로이드 6.0 이상 (API23) 부터는 Doze모드가 추가됨.
         * 일정시간 화면이꺼진 상태로 디바이스를 이용하지 않을 시 일부 백그라운드 서비스 및 알림서비스가 제한됨.
         * 6.0이상의 버전이라면 화이트리스트에 등록이 됐는지 Check
         */
        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        boolean WhiteCheck = false;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            /**
             * 등록이 되어있따면 TRUE
             * 등록이 안되있다면 FALSE
             */
            WhiteCheck = powerManager.isIgnoringBatteryOptimizations(mContext.getPackageName());
            /** 만약 화이트리스트에 등록이 되지않았다면 등록을 해줍니다. **/
            if(!WhiteCheck){
                Log.d("화이트리스트","화이트리스트에 등록되지않았습니다.");
                Intent intent  = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:"+ mContext.getPackageName()));
                mContext.startActivity(intent);
            }
            else Log.d("화이트리스트","화이트리스트에 등록되어있습니다.");
        }
    }

PowerManager를 이용하여 현재 이 앱이 화이트리스트에 등록이 됬는지 안됬는지 판단이 가능합니다.

WhiteCheck변수에서 true값이라면 화이트리스트에 등록이 된것이고, false라면 등록이 되지않은것입니다.

밑에 if문에 보시면 if(!WhiteCheck) 조건이있습니다.

! <-- not 조건이므로 true -> false / false -> true로 변경해줍니다.

만약 등록이 되지않았다면 등록을 진행해주는 Intent를 진행합니다.

이렇게 도즈모드에 빠지지 않도록 해봤는데요.

구글 플레이 스토어에 업로드 하실때 화이트리스트같은 경우 조건이 있다고해요.

https://developer.android.com/training/monitoring-device-state/doze-standby.html?authuser=1#understand_app_standby

잠자기 및 앱 대기 모드에 맞게 최적화하기  |  Android 개발자  |  Android Developers

앱에서 Android 6.0의 절전 기능을 테스트하고 최적화합니다.

developer.android.com

Android 개발 절전 해제 방법

해당 페이지 맨 아래부분에 그에대한 설명이 나와있으니 참고해보시는것도 좋을것같습니다.

하나 더 방법은 FCM을 이용하는 것입니다.

https://onedaycodeing.tistory.com/24

FCM 파이어베이스 포그라운드 백그라운드 알림 및 백그라운드 작업처리

저번 게시글에 있던 소스코드는 단순히 푸시알림을 받기만 하면 되는 코드였습니다. 이번 코드는 웹에서 통해 보내주는 제이슨 형식의 푸시알림을 변경하여 포그라운드 및 백그라운드 푸시알림 + 백그라운드 알림..

onedaycodeing.tistory.com

Android 개발 절전 해제 방법

해당 게시글을 참조하시면 됩니다.

단! 여기서 주의하셔야 할 사항은

웹딴 서버에서 보내실때

제가 적어놓은 

"data":{
	"title" : "aaa",
	"body" : "bbb",
	"channel_id : "Notice"
	},

이부분에서

priority:"high"
"data":{
	"title" : "aaa",
	"body" : "bbb",
	"channel_id : "Notice"
	},

이렇게 "high"를 전송하여 우선순위를 설정해주셔야 합니다.

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

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

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

출처: http://m.blog.naver.com/devstory/130104356488

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

wifiLock 과 wakeLock 을 등록한다.

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

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

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

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

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

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

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

절전모드로 안들어가게 하는 소스입니다.

밝기를 고정 시킨다는 거죠

(Java 코드)

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER.SERVICE);

WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");

wakeLock.acquire();

//화면이 밑의 구문이 나올때까지 밝기고정 됩니다.

wakeLock.release();

*매니페스트 파일

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

자바코드에 진하게 해놓은 부분에는 다른 속성이 들어갈수있습니다

 속성 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 

이상입니다.

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

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

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

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

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

wifiLock 과 wakeLock 을 등록한다.

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

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

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

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

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

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

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

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

 

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

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

android.net.wifi.WifiManager.WifiLock

1

2

3

4

5

6

7

8

9

10

11

12

13

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

1

2

3

4

5

6

7

8

9

10

11

12

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;

}

이렇게 하면 됩니다.

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

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

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

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