2017-04-11 2 views
0

Ich denke, diese Frage wird oft im Stackoverflow gefragt, aber immer noch so viele Menschen kämpfen, um es zu lösen.Doze-Modus ist kritisch für meine App

In meiner Android-App muss ich Gerät alle 30 Minuten aufwecken, um den aktuellen Standort zu erhalten und es an den Server zu senden. Dazu habe ich den AlarmManager mit der Methode setExactAndAllowWhileIdle() und WakefulBroadcastReceiver verwendet. Es funktioniert gut in fast allen Standard/populären Geräten, aber einige andere Geräte meist China Geräte nicht unterstützen oder können nicht Gerät aufwachen aus Doze-Modus mit setExactAndAllowWhileIdle(). Ich habe es in Moto G4 plus (Android OS 6.1) Gerät getestet, die nicht erlauben Alarm-Manager in bestimmten Abständen aufwachen.

Ich benutze AlarmManager, um wakefulBroadcastReceiver aufzurufen, der trigers weckfulIntentservice Hintergrundaufgabe ausführen. aber seine Batterie kritisch und auch im dösen Modus (Nougat), seine Hintergrundaufgabe nicht ausführend. anders als sonst, seine Erfassung von Daten aus Back-End-Service.

my code is here->> 

     // Setup periodic alarm every 30 minutes 
     if (android.os.Build.VERSION.SDK_INT >= 23) { 
      syncDbAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
        intervalMillis, pIntent); 
     } else if (android.os.Build.VERSION.SDK_INT >= 19 
       && android.os.Build.VERSION.SDK_INT < 23){ 
      syncDbAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/, 
        intervalMillis, pIntent); 
     } else { 
      syncDbAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/, 
        intervalMillis, pIntent); 
     } 

ich verwendet habe, Powermanager auch ->

PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE); 
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
     "com.example.johnbravado"); 
wakeLock.acquire(); 
// Do Work 
MyConstants.getInstance().msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0)); 

wakeLock.release(); 

Antwort

0

Ich fürchte, ich habe nur eine Teilantwort.

Meiner Erfahrung nach sollten Sie den wakeLock nicht freigeben. Ich habe bemerkt, dass Motorolas nicht aufwachen, wenn Sie den Wakelock stoppen. Es ist bedauerlich, weil es mehr Batterie verbraucht. Wenn Sie das auf Samsung-Handys tun würden, würde Ihr Batterieverbrauch sehr hoch werden. Daher schlage ich vor, dass Sie eine Bedingung einfügen, bei der, wenn die Marke Motorola (und andere) ist, Sie den Wakelock nicht freigeben. Ich schätze es ist ein Hack, aber es funktioniert für mich.

+0

aber es verbraucht zu viel Batterie und funktioniert auch nicht nach dem Schlafengehen (Doze) -Modus. @FabioC –

+0

Nein, ich lasse wakeLock nicht frei. Standardmäßig wird der Dienst nach dem Wechsel in den Energiesparmodus überhaupt nicht gestartet. –

Verwandte Themen