2017-04-20 3 views
6

Anwendung läuft SDK 23 und höher. Ich führe einige Aufgaben mit dem Service aus, nachdem ich die Aufgabe abgeschlossen habe, und plane die nächste Aufgabe mit AlramManager (setExactAndAllowWhileIdle). Das funktioniert gut. Wenn das Telefon 2 oder 3 Tage ununterbrochen im Leerlauf ist, geht es in den Doze-Modus. Nach dem Doze-Modus funktioniert die Anwendung nicht mehr und Netzwerk und Wakelock funktionieren nicht.Anwendung im Hintergrund ausführen, wenn Telefon in Doze

Gibt es auch, wenn Telefon ist Doze können wir die Anwendung mit jedem Netzwerk Interposition Probleme ausführen. Ich habe versucht, die Anwendung witelist zu halten, aber ich brauche Gerät zu verwurzeln.

adb shell dumpsys deviceidle whitelist +<Package Name> 

Kann jemand mir vorschlagen, welcher beste Weg, Anwendung ohne Unterbrechung zu laufen?

Antwort

2

Erstens, anstatt direkt einen Dienst in der AlarmManager Anruf einen Broadcast-Empfänger anzurufen, der dann den Dienst anruft.

Der Broadcast-Empfänger sollte eine WakefulBroadcastReceiver anstelle einer regulären BroadcastReceiver verlängern.

Und dann lassen Sie den Rundfunkempfänger einen neuen Alarm planen, starten Sie den Dienst mit startWakefulService() statt startService()

public class MyAwesomeReceiver extends WakefulBroadcastReceiver { 
int interval=2*60*60*1000; 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     Intent serviceIntent = new Intent(context, MyAwesomeService.class); 
     Intent receiverIntent = new Intent(context, MyAwesomeReceiver.class); 

     PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 11, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE); 
     alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+interval,alarmIntent); 
     startWakefulService(context, serviceIntent); 
     } 
} 

Die WakefulBroadcastReceiver und startWakefulService() wird Ihre App ein 10 Sekunden-Fenster lassen tun zu lassen, was es braucht, um machen.

Auch

Sie immer den Benutzer fragen, können Sie Ihre App ignorieren Batterie Optimierung Funktionalität using-

PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
Intent intent=new Intent(); 
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
if (powerManager.isIgnoringBatteryOptimizations(getPackageName())) { 
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); 
} 
else { 
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 
    intent.setData(Uri.parse("package:" + getPackageName())); 
    startActivity(intent); 
} 

und im Manifest

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

Sie können Android bitten, Ihre App für den Doze-Modus auf die weiße Liste zu setzen, indem Sie eine GCM-Nachricht mit hoher Pirority senden. Aber denken Sie daran könnte dies Ihre App machen nicht genehmigt von Google Play:

Intent intent = new Intent(); 
String packageName = context.getPackageName(); 
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
if (pm.isIgnoringBatteryOptimizations(packageName)) 
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); 
else { 
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); 
    intent.setData(Uri.parse("package:" + packageName)); 
} 
context.startActivity(intent); 

https://developer.android.com/training/monitoring-device-state/doze-standby.html#whitelisting-cases

+0

zu lassen, dass auch in Ordnung, wenn nicht tun von Google Play genehmigt ist FCM-Nachricht mit hoher Priorität, wie lange das Gerät von Doze aufwachen kann? Ich habe das implementiert. Ist der obige Code von der App-Liste? Wie kann ich das bestätigen? – Sri

+1

@srikanth fragt der Code zur Laufzeit nach 'ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS'. Wenn du hier liest: https://developer.android.com/training/monitoring-device-state/doze-standby.html#support_for_other_use_cases wirst du sehen, dass ihre Dokumente sagen, dass du wieder Zugang zu partiellen Wakelocks erhältst, die deine App war fehlt – mehulmpt

+0

Es funktioniert nicht auch. :( – Sri

1

Eigentlich gibt es keine Möglichkeit, dies zu tun, ohne einen Vordergrund Dienst ausgeführt wird. Die Auflistung in der Whitelist ist möglicherweise nicht für Ihre Anwendung geeignet und obwohl Sie dies tun, bitten Sie den Benutzer, Ihnen die Erlaubnis zu geben, die aus Sicht des Endbenutzers als gefährlich angesehen werden kann.

Allerdings habe ich einen Trick darüber. Hören Sie die Android-Sendungen und wenn Sie das Gerät erwischen, wird es in den Schlafmodus wechseln, starten Sie einen Vordergrund-Dienst. In den meisten Fällen kann der Benutzer das Bild mit der Vordergrundbenachrichtigung nicht sehen und weiß nicht, dass Sie einen Dienst ausführen. Da sich das Gerät im Schlafmodus befindet, ist es stabil, wenn der Benutzer es nicht ansieht. So können Sie tun, was auch immer benötigt wird.

Sie hören auch Broadcasts, die gesendet werden, wenn der Doze-Modus beendet ist. Wenn das passiert, stoppe deinen Vordergrund-Dienst und arbeite in einer normalen Logik mit Alarm-Managern.

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    if(intent.getAction().equals("android.os.action.DEVICE_IDLE_MODE_CHANGED")){ 
     if (pm.isDeviceIdleMode()) { 
      startForegroundService(); 
      //stopAlarmManagerLogic(); 
     } else { 
      stopAutomationForegroundService(); 
      //startAlarmManagerLogic(); 
      return; 
     } 
     AutomationReceiver.completeWakefulIntent(intent); 
     return; 
    } 
} 
+0

danke für diese Antwort. – CauCuKien

0

Nach Android N, kann keine App für immer im Hintergrund laufen. Sie können jedoch Firebase Job Dispatcher verwenden, der Ihnen hilft, Ihre App auszuführen, auch wenn sie sich im Schlummermodus befindet. Mit Hilfe von Firebase Job Dispatcher können Sie dem System mitteilen, dass Ihre App zu einem bestimmten Zeitpunkt ausgeführt werden soll, wenn die Bedingungen erfüllt sind.

Verwandte Themen