Wie aktualisiere ich regelmäßig eine TextView aus einem Service?

  • Antworten:12
Klaus Neumann
  • Forum-Beiträge: 30

20.10.2011, 20:10:04 via Website

Hallo,

ich habe ein erstes kleines Programm fertig, welches mir Trainingsdaten in Textviews anzeigt.
Die Daten werden über GPS ermittelt. Jetzt bin ich angefangen ein Service daraus zu machen,
damit die die Daten weiter im Hintergrund ermittelt und berechnet werden und damit mir die Trainingsdaten
auch angesagt werden, wenn die Anwendung im Hintergrund weiterläuft.
Jetzt meine Fragen:
Habe in der Activity die Textviews um die Daten anzuzeigen (oder gehören die in den Service?).
Ein einmaliges Setzen der Werte in dem Service klappt schon, aber wie bekomme ich das regelmäßig hin (jede Sekunde?)

Gruß
klaus

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

21.10.2011, 09:38:13 via Website

Die Activity existiert nicht mehr unbedingt wenn ein Service läuft. Ich verschicke deshalb immer Broadcasts an die interessierten Activities. Die Activity, sofern sie überhaupt aktiv ist, setzt dann den Inhalt des TextViews im onReceive. Der zugehörige BroadcastReceiver ist bei mir immer eine Inner Class der Activity.

Schau Dir mal die verschiedenen Startmöglichkeiten eines Service an (startService vs. bindService). Bei einem mit startService gestartetem Service existiert ohnehin keine Verbindung zwischen Activity und Service. Bei einem mit bindService gestartetem Service ist das anders. Ich bin da aber mal in der Anfangszeit ziemlich derb auf die Nase gefallen deshalb gehe ich grundsätzlich davon aus das Komponenten vom Android abgeschossen wurden und arbeite fast überwiegend mit Messages wie Broadcasts.

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

21.10.2011, 11:00:11 via Website

Hallo,

ich bin ja erstmal Froh das ich schon soweit bin. Ja ich blicke da noch nicht genau durch.
Welche Komponenten welche Aufgaben machen sollen (Activity, Service usw).

Ich schau mir das mal mit den Braodcasts an.

Gruß
Klaus

Antworten
Florian B.
  • Forum-Beiträge: 284

21.10.2011, 11:08:06 via Website

Wäre es nicht auch eine Alternative den Service die GPS Daten in eine Datenbank oder in eine SharedPreference schreiben zu lassen, und dann einfach aus der Activity periodisch zu pullen?

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

21.10.2011, 11:44:09 via Website

ja wäre eine möglichkeit, aber eine ziemlich schlechte :)

variante 1: immer wenn es etwas neues gibt, wird die gui benachrichtig
variante 2: die gui schaut alle x sekunden nach, ob neue daten da sind

liegt wohl auf der hand, dass variante 1 wesentlich besser ist. der akku wird es dir auf jeden fall danken.

swordiApps Blog - Website

Antworten
Maximilian O
  • Forum-Beiträge: 990

21.10.2011, 13:00:13 via App

Finde die Variante mit der db aber auch am besten. Einfach wenn es Änderungen gibt diese in der Datenbank aktualisieren und dann im onResume der activity die textviews aktualisieren.
MfG

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

21.10.2011, 13:03:31 via Website

Hallo,

also meine kleine App soll folgende Eigenschaft bekommen:
Nach einem bestimmten Interval (alle 2 Kliometer) soll die App mir sagen, wieviele Kilometer und welche Zeit dafür benötigt wurde, ansagen.
Das klappt ja auch bis jetzt schon, allerdings nur solange die App auch zu sehen ist.
Da ich aber Musik hören möchte, muss meine kleine App in der Lage sein, das auch im Hintergrund durchzuführen.

variante 2: die gui schaut alle x sekunden nach, ob neue daten da sind
Wie mache ich das denn? Mit Broadcasts???? Da ist ja genau mein Problem. In der jetzigen App werden die Textviews durch den LocationListener aktualisiert. Die Anzeige aktualisieren ist eins, die Sprachausgabe mein zweites Problem. Und dann muss ich natürlich während der Ansage die Laustärke der Musik runterfahren und nach der Ansage wieder lauter machen... geht sowas auch?

Gruß
Klaus

Antworten
Florian B.
  • Forum-Beiträge: 284

21.10.2011, 13:54:16 via Website

Markus Gu
ja wäre eine möglichkeit, aber eine ziemlich schlechte :)

variante 1: immer wenn es etwas neues gibt, wird die gui benachrichtig
variante 2: die gui schaut alle x sekunden nach, ob neue daten da sind

liegt wohl auf der hand, dass variante 1 wesentlich besser ist. der akku wird es dir auf jeden fall danken.

Gut, da hast du natürlich recht.

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

21.10.2011, 15:40:09 via Website

Hallo zusammen und danke für die rege Teilnahme,

ich haben ein !! Objekt (Datencontainer für die GPS-Daten bzw. berechnete Geschwindigkeit und zurückgelegte Strecke),
was soll ich da mit einer Datenbank? ( Dann baue ich womöglich noch einen O/R mapper ein, ein Transactionhandling usw...
Für ein Objekt ist das wohl nicht der richtige Weg!

Diesen Datencontainer möchte ich in dem Service füllen und in der GUI anzeigen.
Im Grundsatz soll jede Sekunde die Textviews aktualisiert werden.
Kann ich eine Sprachausgabe aus einem Service machen?
Und wo implementiere ich den LocationListener? Wenn ich den im Service implementiere,
muss ich auch zu den Einstellung switchen um die GPS zu aktivieren.
Das klappt vom Activity aber irgendwie nicht vom Service....

Gruß
Klaus

— geändert am 21.10.2011, 19:04:24

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

22.10.2011, 10:41:29 via Website

Ich gehe jetzt mal nicht auf die geschätzten 10 neuen Fragen im letzten Post ein, TLDR.

Bzgl. Datenbank und Activity TextView: Das kommt natürlich darauf an was Du willst. Das Schreiben der Location Updates in eine Datenbank und das Pollen der Datenbank aus der Activity ist natürlich das Schlechteste das Du machen kannst. Es hindert Dich aber niemand daran die Werte in eine Datenbank zu schreiben und parallel per Broadcast interessierte Activities zu informieren. In dem Fall hat die Datenbank nur Sinn wenn die Daten auch über die aktuelle Aufzeichnung hinaus gespeichert bleiben sollen.

Der LocationListener ist bei mir immer im Service. Der Service versendet besagte Location Updates per Broadcast an die Activities die etwas damit anfangen können, ist aber auch gleichzeitig ein Broadcast Receiver um Stopp, Pause und Resume Events von den unterschiedlichen Aktivitäten empfangen zu können. Der Service beschreibt bei mir eine Datenbank da z.B. meine beiden Apps (GaCoMo und das Tankbuch) diese Daten speichern um Kartenmaterial über die zurückgelegten Strecken auch zu einem späteren Zeitpunkt noch anzeigen zu können.

Vieles hängt vom konkreten Anwendungsszenario ab.

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

22.10.2011, 12:48:38 via Website

Hallo Harald,

das hört sich sehr vernünftigt an.
Zu dem LocationListener im Service habe ich allerdings ein Problem/Frage.

Wenn der Provider nicht verfügbar ist mache ich folgendes in der Activity:
public void onProviderDisabled(String provider) {
Log.v(tag, "Disabled");
Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}

Geht das aus dem Service nicht ?

Gruß
Klaus

— geändert am 22.10.2011, 12:49:44

Antworten
Markus B.
  • Forum-Beiträge: 636

22.10.2011, 17:38:32 via Website

Hi, ich empfehle die noch mal genau zu schauen was die Aufgaben eines local und remote Service sind.
Zudem würde ich die empfehlen folgendes zu lesen. Dann wirst du erkennen das die Idee, welche du verfolgst, zu Problemen führen kann.

Gruß,
Markus

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

22.10.2011, 17:41:09 via Website

Hier gibt es einen guten Thread zu dem Thema:

http://stackoverflow.com/questions/6905893/open-system-settings-from-a-service

In dem ganzen Text ist der meines Erachtens beste Hinweis der Verweis auf das Notification System. Ich würde mich schwer bedanken wenn mir irgendein Service (die Activity ist eventuell nicht mehr da) den Fokus aus dem E-Mail Programm reißt. Ich hätte dann einen richtig dicken Hals und die zugehörige App wäre in Sekunden vom Handy gelöscht.

So würde ich es machen: Der Service setzt eine Notification ab. Der Benutzer kann diese "runterziehen" und von dort zu den Settings springen. Vorab würde ich das noch vor dem Start des Service in der Activity prüfen. Ändert sich das während der Service läuft --> Notification.

Antworten