Android kappt Netzverbindung nach Ausschalten des Displays?

T

txbarth

Ambitioniertes Mitglied
0
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:
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
 
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";
 
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.
 
txbarth schrieb:
A
obwohl der Service einen Anfrageinterval von 5 Sekunden hat. Deshalb gehe ich jetzt davon aus, dass der Service auch läuft.

ich gehe mal davon aus, dass du 5 sekunden nur zum testen gewählt hast. denk an die akku verschwendung bei so starken polling
 
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.
 
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.
 
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:
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();
 
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.
 
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."
 
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.
 

Ähnliche Themen

wernho
Antworten
11
Aufrufe
680
wernho
wernho
A
Antworten
1
Aufrufe
639
swa00
swa00
M
Antworten
4
Aufrufe
1.168
swa00
swa00
Zurück
Oben Unten