2016-05-13 15 views
1

Ich habe Probleme mit Androiden Deep Sleep-Modus nach einer Stunde im Tiefschlaf. Das Problem tritt nur bei Android 6+ auf. Auf Android < 5 tritt das Problem nicht auf. Nicht mit Android 5 getestet, da kein Gerät verfügbar ist.Warum das Android (6.0) System für eine Netzwerkverbindung nach ~ 1 Stunde im Tiefschlaf

Gerätekonfiguration:
Ich habe zwei Android 6 Geräte, Google Nexus 5 und HTC One M9. Beide Geräte sind nur als WLAN konfiguriert (ohne SIM-Karte) und die WLAN-Richtlinie ist immer aktiviert (selbst im Schlafmodus).

Die Situation:
Ich habe einen wakeful Rundfunkempfänger, dh auf AlarmManager.ELAPSED_REALTIME_WAKEUP registriert alle 2 Minuten zu feuern, wenn die Anwendung im Hintergrund geht. Auch die Wifi-Sperre ist akut, wenn die Anwendung pausiert und freigegeben wird, wenn die Anwendung in den Vordergrund tritt.

Seit Android KitKat AlarmManager.setRepeating (...) ist inexat, auf Android 6 verwende ich AlarmManager.setWindow (...) mit einem Fenster von nur 1 Sekunde.
Jedes Mal, wenn der Empfänger auslöst, wird der Empfänger (PendingIntent) erneut registriert.

Der Empfänger hat eine einfache Aufgabe. Er sollte nur eine Weburl anrufen (Anfrage bekommen). Der Wakelock wird freigegeben, nachdem die Anfrage erfolgreich war, das Zeitlimit überschritten wurde oder eine Ausnahme ausgelöst wurde.

Im Manifest existiert auch die WAKE_LOCK-Berechtigung.

Das Problem:
Wenn ich die Anwendung im Hintergrund setzte (Empfänger wird aktiviert) und dann den Bildschirm auszuschalten, wird der Empfänger korrekt alle 2 Minuten genannt, aber nach ca. 1 Stunde schlägt die Netzwerkanforderung.

Das Protokoll zeigt, dass der Empfänger auch nach 1h aufgerufen wird, nur die Netzwerkanforderung schlägt fehl.

Quellcode Beispiel:

public class TestTools { 
    private static final String LOG_TAG = TestTools.class.getSimpleName(); 

    public static String excuteGet(String targetURL) { 
     try { 
      URL obj = new URL(targetURL); 
      HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
      con.setRequestMethod("GET"); 
      con.setConnectTimeout(10*1000); 
      con.setReadTimeout(5*1000); 

      int responseCode = con.getResponseCode(); 
      Log.d(LOG_TAG, "GET Response Code :: " + responseCode); 

      if (responseCode == HttpURLConnection.HTTP_OK) { // success 
       BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
       String inputLine; 
       StringBuilder response = new StringBuilder(); 

       while ((inputLine = in.readLine()) != null) { 
        response.append(inputLine); 
       } 
       in.close(); 

       // print result 
       Log.d(LOG_TAG, response.toString()); 

       return response.toString(); 
      } else { 
       Log.d(LOG_TAG, String.format("GET request not worked (response code :: %s)", responseCode)); 
      } 
     } 
     catch (ProtocolException e) { 
      Log.d(LOG_TAG, "ProtocolException: " + e.getMessage()); 
     } 
     catch (MalformedURLException e) { 
      Log.d(LOG_TAG, "MalformedURLException: " + e.getMessage()); 
     } 
     catch (IOException e) { 
      Log.d(LOG_TAG, "IOException: " + e.getMessage()); 
     } 

     return null; 
    } 

} 

public class Receiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     Log.d(LOG_TAG, "onReceive"); 

     final Thread test = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       TestTools.excuteGet("http://www.google.de/"); 
      } 
     }); 
     test.start(); 

     try { 
      test.join(); 
     } catch (InterruptedException e) { 
      Log.d(LOG_TAG, e.getMessage()); 
     } 

     // here the receiver is reregistered 

     WakefulBroadcastReceiver.completeWakefulIntent(intent); 
    } 
} 

Haben Sie eine Idee, was falsch ist und wie geht es zu beheben?


Update: Um App mit Android dösen Modus arbeiten, müssen Sie diese die Anforderung fehlschlägt Netzwerk https://developer.android.com/training/monitoring-device-state/doze-standby.html#assessing_your_app

Antwort

5

aber nach ca. 1 Stunde verabschieden

Vermutlich das Gerät ging in Doze mode.

Haben Sie eine Idee haben, was vom Standpunkt des Benutzers

falsch gehen wird, und vom Standpunkt des Android, falsch läuft nichts. Alles funktioniert wie erwartet.

Bitte haben Sie Verständnis dafür, dass der Doze-Modus speziell hinzugefügt wurde, um zu verhindern, dass Entwickler das tun, was Sie gerade tun. Die Netzwerk-I/O-Vorgänge alle zwei Minuten durchzuführen, ist für die Akkulaufzeit schrecklich. Zu viele Entwickler interessieren sich nicht für die Benutzer und die Batterien dieser Benutzer, und so nimmt Android die Kontrolle von diesen Entwicklern, um den Benutzern zu helfen.

wie es zu beheben?

In großem Umfang gibt es nichts zu beheben. Auch hier funktioniert alles nach Vorgaben. Möglicherweise müssen Sie Ihre Erwartungen anpassen.

Wenn nun der Benutzer denkt, dass der Benutzer Ihrer Anwendung ermöglichen, will mehr Batterie zu verbrauchen, kann der Benutzer Ihre Anwendung Batterie Optimierung weiße Liste hinzuzufügen. Dies geschieht unter Einstellungen> Apps> (Zahnradsymbol in der Aktionsleiste)> "Batterieoptimierungen ignorieren". Jede App, für die "Batterieoptimierungen ignorieren" eingestellt ist, verhält sich mehr wie ältere Geräte.

Der Benutzer ist auch willkommen, ihr Gerät auf einem Ladegerät zu halten; Während des Ladevorgangs geht das Gerät nicht in den Doze-Modus.

+0

Danke für Ihre Antwort. Das Deaktivieren der Akku-Optimierung sollte mein Problem beheben. Für Ihr Interesse: Warum brauche ich den Netzwerkzugang alle 2 Minuten? Ok, ich brauche nur 2 Netzwerkzugriffe pro 10 Minuten, weil ich eine VoIP (SIP) -App entwickle und der SIP-Registrar ein maximales Registrierungs-Timeout von 10 Minuten erzwingt. Also muss ich mich alle 10 Minuten erneut registrieren. 2 Zugriffe pro 10 Minuten, da bei fehlgeschlagener Registrierung der zweite Reregister erfolgreich sein sollte. – erdnussflips

+0

Damit die App mit dem Android-Doze-Modus funktioniert, müssen Sie diese https://developer.android.com/training/monitoring-device-state/doze-standby.html#assessing_your_app übernehmen – erdnussflips