Wert aus Service in Activity anzeigen und aktualisieren

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

17.04.2012, 15:35:33 via Website

Hallo,

ich habe so eine ähnlich Frage schon einmal gestellt und leider keine richtige Lösung bekommen.
Ich habe eine Activity die mir GPS-Daten anzeigen soll. Dann habe ich einen Service der GPS-Daten ermittelt und einige Berechnungen durchführt.
Diese Werte speichere ich in einem Object, welches ich in der Activity zu TextViews mappen möchte.
Ich bekomme den Werte 1. nicht in der Activty angezeigt, und zweitens werden die Daten ja ständig (alle 2 Sekunden geändert).
Das soll natürlich in der Activity angezeigt werden.
Geht das so grundsätzlich oder benötige ich andere Dinge?

Gruß
navino

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

17.04.2012, 17:58:01 via App

Hi, das kannst du mit einem Broadcastreceiver oder einem Handler lösen.
Ich habe hier mal ein Beispiel erstellt, welche zeigt wie du es mit einem Handler machen kannst. Ich schaue mal, ob ich es heute / morgen noch schaffe dort die Broadcastreceiver mit aufzunehmen. Sollte aber eigentlich kein Problem darstellen.

Gruß,
Markus

— geändert am 17.04.2012, 18:20:27

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

17.04.2012, 18:37:29 via Website

Hallo,

und danke für das Beispiel. Ist das Beispiel ein Eclipse-Projekt, oder wie kann ich da am besten ausprobieren?
Habe es in ein Eclipse-Projekt eingebunden und gestartet, und läuft soweit. Ich möchte allerdings das meine Anzeige in der Activity automatisch akualisiert wird, das macht es zur Zeit nur wenn ich auf den Button callService klicke.

Gruß
navino

— geändert am 17.04.2012, 18:50:40

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

17.04.2012, 18:54:56 via Website

Hi,
dann baust du noch einen Timer ein, welcher die Daten vom Service holt oder für den Fall wohl besser mitm Broadcastreceiver.
Das kann ich dir aber erst morgen zeigen, da ich nun los muss.

Gruß,
Markus

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

17.04.2012, 19:32:51 via Website

Hallo,

ich denke so ein BroadCastReceiver wäre besser, - oder ?
Habe jetzt mal folgendes im Service hinzugefügt:

public void onLocationChanged(Location location) {
try{

Toast.makeText(this, " a onlocationChanged" ,Toast.LENGTH_SHORT).show();
trainingData.setHoehe(location.getAltitude() - 47.5);
Toast.makeText(this, "b onlocationChanged" +location.getAltitude() ,Toast.LENGTH_SHORT).show();
Toast.makeText(this, "c onlocationChanged" +trainingData.getHoehe() ,Toast.LENGTH_SHORT).show();
Intent intent = new Intent("de.navino.LOCATION_CHANGED");
sendBroadcast(intent);
}catch (Exception e){
e.printStackTrace();
Log.e(tag, e.getMessage());
}
}

und das in der Activity:

private final BroadcastReceiver meinReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
refresh();
}
};

private void refresh(){
Toast.makeText(this, "aktuell", Toast.LENGTH_SHORT).show();
}

Doch leider kommt der Toast : Toast.makeText(this, "aktuell", Toast.LENGTH_SHORT).show(); nicht!


Gruß
navino

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

18.04.2012, 16:48:41 via Website

Hallo,

habe das mit dem Broadcastreceiver hinbekommen. Ich brauchte halt noch einen IntentFilter.
Super das wäre schon mal ein großes Problem gelöst.
Jetzt hab ich noch das Problem, das die Activity nicht beendet wird, bzw der Service weiter läuft.

Mache folgendes bei Klick auf Beenden:

@Override
public void finish(){
super.finish();
Toast.makeText(this, "Activity, onFinish", Toast.LENGTH_SHORT).show();
unbindService(mConnection);
stopService(new Intent(this, GPSService.class));
this.onDestroy();

}
@Override
public void onDestroy(){
super.onDestroy();
Toast.makeText(this, "Activity, onDestroy", Toast.LENGTH_SHORT).show();
}

Ser Service läuft aber weiter....
Was mache da falsch??

Gruß
navino

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

19.04.2012, 20:26:01 via Website

Hi,
also jetzt mal ganz langsam:
Du möchtest also das dein Service nur rennt wenn die Activity angezeigt wird ? Wenn die Activity dann nicht im Vordergrund ist soll auch der Service nicht mehr rennt ?

Du musst halt bei den Services folgendes unterscheiden:

- remote Service
- local Service

Bei den BroadCastReceiver gibt es dann auch wieder verschiedene:

- Dynamische
- Statische
- LocalBroadcastManager

Nun gilt es fürs erste mal zu entscheiden was in deinem Fall überhaupt sinnig ist. Bei BroadcastReceivern sollte man auch den Sicherheitsaspekt nicht vergessen. Das macht dann aber auch wieder einen Unterschied je nach Art des Receivers.
Mach jetzt bitte nicht den Fehler und kopier dir irgendwelchen Code zusammen ohne zu verstehen was da genau abgeht.

Gruß,
Markus

Antworten
Klaus Neumann
  • Forum-Beiträge: 30

20.04.2012, 06:58:20 via Website

Hallo,

ich hatte das Problem, das nach dem finisch() der Activity der Service weitergelaufen ist. Das ist jetzt aber so weit i.o.
Mein Service soll im Hintergrund GPS-Daten sammeln um mir einige Dinge wie zurückgelegte Strecke zu berechnen.
Die Activity soll das ganze anzeigen. Erstmal war es das.
Ok die Unterschiede der einzelnen Services/Broadcastreceivers kenn ich (noch) nicht.
Der Service und die Activity laufen jetzt soweit und mir wird die Strecke angezeigt.
Werde mich jetzt erstmal damit beschäftigen die Sache ein wenig schicker zu machen.

Gruß
navino

Danke für die Unterstützung

Antworten