마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

wakelock 을 사용한 화면 깨우기가 잘 안돼요..

0 추천
public class WakeLockUtil {
    private static PowerManager.WakeLock sCpuWakeLock;
    private static KeyguardManager.KeyguardLock mKeyguardLock;
    private static boolean isScreenLock;

    public static void acquireCpuWakeLock(Context context) {
        if (sCpuWakeLock != null) {
            return;
        }
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        sCpuWakeLock = pm.newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK |
                        PowerManager.ACQUIRE_CAUSES_WAKEUP |
                        PowerManager.ON_AFTER_RELEASE, "hello");

        sCpuWakeLock.acquire();
    }

    public static void releaseCpuLock() {
        if (sCpuWakeLock != null) {
            sCpuWakeLock.release();
            sCpuWakeLock = null;
        }
    }

}

이런 wakelock 해주는 애를 만들구요..

 

푸시 받았을 때

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMessagingService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        WakeLockUtil.acquireCpuWakeLock(this);

 

이렇게 쓰는데 화면이 안켜지거든요..

 

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

퍼미션도 추가했어요 ㅠㅠ

 

뭐가 문제인가요..

 

윤둥이 (4,560 포인트) 님이 2017년 11월 16일 질문

2개의 답변

+1 추천
 
채택된 답변
안드로이드 6.0 마시멜로 OS에서는 Doze Mode 정책상 WakeLock이 무시되는 경우가 있습니다.

7.0 누가 8.0 오레오 역시 적극적 Doze는 아니지만 배터리 최적화 문제로 일정시간 이후로는 WakeLock을 무시하고 일정 주기마다 실행합니다.

특히 Display에 대한 부분은 엄격하게 제한을 두고 있는걸로 알고있습니다.

위에서 답변해주신 링크에는 JobScheduler를 이용해보라고 힌트를 주신 것 같습니다.

댓글에 대한 댓글에는 어플이 Foreground, 즉 화면에 나타나 있을 때와 Background, 다른 앱을 사용하거나 홈 화면을 호출할 때 해당 어플이 화면에 노출되지 않는 경우 두 가지 형태로 다른 상태를 지닙니다.

백그라운드 상태의 경우에는 리소스가 충분하지 않은 경우 미리 실행해놓은 동작을 하지 않을 수 있습니다.

이를 언급하신 것 같습니다.
minor (13,710 포인트) 님이 2017년 11월 16일 답변
윤둥이님이 2017년 11월 16일 채택됨
친절한 답변 감사합니다!

마시멜로우 이상에서 웨이크락을 사용하려면 카카오톡처럼 죽지않는 서비스같은거 구현 후 거기서 잡스케쥴러 이용해서 계속 주기적으로 깨워야겠네요..?

그냥 하면 안된다는거죠..?

무시되는 경우가 있는게 아니고 100% 무시되는 거 같더라구요
카카오톡은 아마 GCM이나 FCM의 방식을 차용해서 자체 구축한걸로 알고있습니다.
Doze WhiteList라는 개념도 있는데, 이건 Google측에 해당 어플에 대한 등록과정이 필요하다고 알고있습니다. 음악 어플이나 메신저같이 즉시 알람이 필요한 경우는 이런 과정이 필요합니다.

화면을 사용하지 않고 Service를 사용하신다면 Foreground Service라는 개념도 있으니 참고해보세요 :)
0 추천
aucd29 (218,390 포인트) 님이 2017년 11월 16일 답변
무슨 말인지 잘 모르겠네요..
==> Wow, so an app that run in background with screen off doesn't work anymore :(
...