1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Android kappt Netzverbindung nach Ausschalten des Displays?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von txbarth, 22.07.2011.

  1. txbarth, 22.07.2011 #1
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Hi, ich habe in meiner App einen Service integriert, der so lange weiterlaufen soll, bis der Benutzer die App manuell über das Optionsmenü beendet. Dieser Service benötigt aber eine ständige Verbindung zum Internet, um Anfragen an einen Server stellen zu können. Bei Zustandsänderungen soll eine Benachrichtigung gesendet bzw. mit einem Standardton in der Statuszeile dargestellt werden. Kann man einen Service eine so hohe Priorität geben, dass die Netzverbindung nicht beendet wird, wenn das Display ausgeschaltet wird? Sobald ich das Display ausschaltet, sehe ich auf dem Server keine Anfragen mehr.
     
    Zuletzt bearbeitet: 22.07.2011
  2. Swoop, 22.07.2011 #2
    Swoop

    Swoop Android-Hilfe.de Mitglied

    Beiträge:
    115
    Erhaltene Danke:
    4
    Registriert seit:
    20.05.2011
    Phone:
    Nexus S
    Hast du schonmal versucht Ausgaben zu machen und geschaut ob dein Service überhaupt weiterläuift?

    Ich denke weniger, dass das Handy in Internetverbinung kappt, denn dann wären ja Apps wie Facebook, WhatsApp und Co aufgeschmissen...
    Ich denke eher das er deinen Service in eine Art Pause-Modus versetzt, um Akku zu sparen usw.

    Grüße Swoop
     
  3. txbarth, 22.07.2011 #3
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Auf dem Server sehe ich, dass manchmal noch eine Anfrage durchkommt. Mal nach 15 Minuten oder 2 Minuten, obwohl der Service einen Anfrageinterval von 5 Sekunden hat. Deshalb gehe ich jetzt davon aus, dass der Service auch läuft.
    Ich habe jetzt aber trotzdem mal Kontrollausgaben in eine Datei geschrieben. Ich kann diese Datei aber nicht finden. Ich habe mit dem Astro Dateimanager danach such lassen. Wo musste ich nachsehen, wenn ich die Log-Datei wie folgt definiert habe:

    String path = getFilesDir().getAbsolutePath() + File.separator + "check.log";
     
  4. JanF, 22.07.2011 #4
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Datei liegt wahrscheinlich in
    /data/data/[deinPaketName]/files

    Darauf kannst Du per adb zugreifen.

    Möglicherweise liegt Dein Problem auch da dran, dass das Handy die WLAN Verbindung beim Display ausschalten deaktiviert. Dieses Verhalten kann man - zumindest beim Galaxy S ändern in den WLAN Einstellungen.
     
  5. swordi, 23.07.2011 #5
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    ich gehe mal davon aus, dass du 5 sekunden nur zum testen gewählt hast. denk an die akku verschwendung bei so starken polling
     
  6. txbarth, 25.07.2011 #6
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Hallo, ich konnte mich erst heute Morgen mit dem Problem wieder auseinandersetzen.

    Also, an die Dateien in /data/data/[paket_name]/files komme ich nicht ran, da ich eine "Permission denied"-Meldung bekomme und beim Versuch root-Rechte zu erlangen (adb root), erhalte ich die Meldung "adbd cannot run as root in production builds".

    Aber da man ja über die USB-Debugging Methode alle Meldungen in Eclipse bekommt, sobald man im Debug-Modus das Gerät als "Emulator" auswählt, habe ich nun feststellen müssen, dass die Netzverbindung nicht getrennt wird, sobald das Display ausgeschaltet wird. Das ist nicht gut, weil sich beim USB-Debugging Android offensichtlich anders verhält, als im Normalbetrieb.

    Wenn ich nur wüsste, dass die Netzverbindung nicht getrennt wird, wenn die App eine dauerhafte Socket-Verbindung zu einem Server hält, dann würde ich auch das noch einbauen, aber so?

    Bei den Mobilfunkeinstellungen ist übrigens der jederzeitge Datenempfang aktiviert. Es wird wohl nichts anderes übrig bleiben, das Display nicht auszuschalten und dann komplett abzudunkeln, um den Akku bei Nutzung der App nicht zu sehr belasten. Ideal ist das nicht.
     
  7. swordi, 25.07.2011 #7
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    deinen lösungsansatz würde ich da nochmal ganz überdenken. denn das ist alles andere als ideal

    lieber das problem selbst beheben, als mit einem hack umgehen.
     
  8. txbarth, 28.07.2011 #8
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Ich habe nun eine Server-Applikation erstellt, mit der die Client-App sich per SocketChannels dauerhaft verbinden kann. Wenn der Datenzustand sich serverseitig ändert, teilt der Server dies dann dem Client mit, um sich die neuen Daten zu holen.

    Leider wird die App komplett angehalten, sobald in der Hauptaktivität onPause() aufgerufen wird, inklusive des "Foreground-Services", der für die Verbindung zum Server und die Datenabfragen zuständig ist. Der Service läuft aber nicht im Hauptthread der App, es wird mit dem Service ein WorkerThread gestartet, der eigentlich erst enden soll, wenn die Applikation explizit über das Optionsmenü beendet wird.
    Die Frage im Betreff müsste ich nun umformulieren: Warum werden java.lang.Threads in einem (Vordergrund-)Service nach Ausschalten des Displays eingefroren, und laufen ohne Ausnahmefehler weiter, sobald das Display wieder angeschaltet wird? Und durch was muss ich dann so einen Thread ersetzen, damit der Service wirklich im Hintergrund (Display aus) weiterläuft?
     
    Zuletzt bearbeitet: 29.07.2011
  9. txbarth, 29.07.2011 #9
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Hier kann man sehen, dass die Threads, die die Kontrollausgaben erzeugen, von onPause() bis onResume() eingefroren werden. onPause() wurde hier durch Ausschalten des Displays ausgelöst.

    Code:
    2011-07-29 14:58:35 ServiceHandler.handleMessage() warte 3 seconds
    2011-07-29 14:58:38 ServiceHandler.handleMessage() warte 3 seconds
    2011-07-29 14:58:38 act=session
    2011-07-29 14:58:41 ServiceHandler.handleMessage() warte 3 seconds
    2011-07-29 14:58:43 act=session
    2011-07-29 14:58:44 ServiceHandler.handleMessage() warte 3 seconds
    2011-07-29 14:58:44 MainActivity.onPause()
    2011-07-29 14:59:20 MainActivity.onResume()
    2011-07-29 14:59:20 ServiceHandler.handleMessage() warte 3 seconds
    2011-07-29 14:59:22 act=session
    2011-07-29 14:59:23 ServiceHandler.handleMessage() warte 3 seconds
    2011-07-29 14:59:26 ServiceHandler.handleMessage() warte 3 seconds
    2011-07-29 14:59:27 act=session
    
    Ich habe es im Grunde so implementiert, wie es hier im Beispiel "Extending the service class" Services | Android Developers gezeigt wird. Jemand eine Idee, warum selbst ein HandlerThread, für den es ja extra noch den Parameter Process.THREAD_PRIORITY_BACKGROUND gibt, trotzdem eingefroren wird?

    Code:
    HandlerThread thread = new HandlerThread("ServiceStartArguments",
                                                 Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();
    
     
  10. DieGoldeneMitte, 29.07.2011 #10
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    Also ein HandlerThread ist etwas anderes als ein Service, sondern halt nur ein Thread in deiner App.

    Ein Service entspricht dann einem eigenen Prozess, der unter der selben Userid wie deine App läuft. Und das scheint mir das zu sein, was du willst.
     
  11. txbarth, 29.07.2011 #11
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    Hm, wenn ich einen Namen für den Prozess angebe mit einem vorangestellten Doppeltpunkt,

    <service android:name="NotifyService" android:process=":MyExtraService"></service>

    dann bekomme ich einen Ausnahmefehler:

    FATAL EXCEPTION: main
    java.lang.ClassCastException: android.os.BinderProxy
    ...

    Es heißt doch
    "If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the service runs in that process."
     
  12. txbarth, 01.08.2011 #12
    txbarth

    txbarth Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    46
    Erhaltene Danke:
    0
    Registriert seit:
    20.06.2011
    So, es funktioniert nun. Man muss den Service gar nicht in einem separaten Prozess laufen lassen. Ich habe es über die Wake-Lock Permissen gelöst. Die App darf nun den Standby-Modus deaktivieren. Mit dem Ausschalten des Displays ging das Gerät gleich in den Standby-Modus. Deshalb hat das mit dem zweiten Prozess auch nicht funktioniert, da dieser ebenfalls angehalten wurde.

    In der manifest-Datei wird angegeben:
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

    In der Methode onCreate() des Services steht

    Code:
      public void onCreate() {
        [...]
        powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Tag");
        wakeLock.acquire();
      }
    
    Wichtig ist hier, dass für diesen Zweck PowerManager.PARTIAL_WAKE_LOCK angegeben wird, nicht PowerManager.FULL_WAKE_LOCK

    In der Methode onDestroy() des Services muss dann Wake-Lock beendet werden

    Code:
      public void onDestroy()  {
       [...]
        wakeLock.release();
      }
    
    Der Service läuft mit ausgeschaltetem Display weiter.
     

Diese Seite empfehlen