Frage zu Service

GENiALi

GENiALi

Fortgeschrittenes Mitglied
11
Hallo

Ich denke es fehlt mir da noch am Verständnis. Ich müsste folgendes machen.
Der Anwender erfasst diverse Records. Diese werden in eine DB gespeichert. Soweit so gut. Diese Daten müssen aber auf einen Server. Unabhängig davon ob die Anwendung noch läuft oder nicht.

Das würde ich, so viel ich weiss, mit einem Service lösen. Dieser Service kann ja mehr als nur eine Aufgabe erledigen. Oder? Nur, wie Teile ich dem Service mit das er jetzt die Aufgabe A machen soll? Wärend der Arbeit will ich dem Service dann noch mitteilen können das er jetzt noch die Aufgabe B machen soll, wärend die Aufgabe A noch läuft. Geht das?

Ich wollte den Service via Broadcast informieren. Mit einer Action dann unterscheiden welche Aufgabe ausgeführt werden soll. Nur, ich bekomme die Implementierung des Broadcast nicht hin weill ich es wahrscheinlich noch nicht ganz verstehe.

Hinweise dir mir Helfen?
 
Geht alles, solltest warscheinlich nur günstig Threaden.
 
Unicate schrieb:
Geht alles, solltest warscheinlich nur günstig Threaden.
Das mit dem Threads ist mir bewusst.
Mir ist aber nicht klar wie ich einem Service, der ja schon läuft, mitteilen kann das er jetzt Job A und danch noch Job B starten soll.
 
Naja, erstellst einen Thread Tasks in einer Liste hält.

Wenn der Thread noch nicht existiert (==null) dann soll er gestartet werden mit einem Task.

Wenn er schon existiert, dann soll ein Task hinzugefügt werden (thread.addTask() oder so)

Wenn der eine dann fertig ist, schaust du ob noch ein anderer in der warteschlage steht und arbeitest den eben ab. queueing
 
Unicate schrieb:
Naja, erstellst einen Thread Tasks in einer Liste hält.

Wenn der Thread noch nicht existiert (==null) dann soll er gestartet werden mit einem Task.

Wenn er schon existiert, dann soll ein Task hinzugefügt werden (thread.addTask() oder so)

Wenn der eine dann fertig ist, schaust du ob noch ein anderer in der warteschlage steht und arbeitest den eben ab. queueing

OK. Das ist mir auch noch alles klar. Ich versuchs mal anders.

Ich habe eine Activity mit zwei Buttons. Job A und Job B. Wenn ich jetzt auf Job A klicke muss ich irgend wie den Service informieren das er den Job A Thread starten soll. Das selbe bei Job B. Genau das Informieren verstehe ich noch nicht ganz. Ich denke das müsste irgend wie über Intents und Broadcast's gehen. Aber ich verstehe nicht ganz was ich dahingehend definieren muss.
 
Also wenn ich Dich richtig verstehe, ist dein Problem das du nicht weisst wie du dem Service mitteilst das er diese Jobs starten soll.

Dazu musst du ein aidl-file erstellen. Das ist so ähnlich wie ein Interface.

Aber hier ist ein Tutorial zu dem Thema mit Sourcecode
 
  • Danke
Reaktionen: GENiALi
Unicate schrieb:
Also wenn ich Dich richtig verstehe, ist dein Problem das du nicht weisst wie du dem Service mitteilst das er diese Jobs starten soll.

Dazu musst du ein aidl-file erstellen. Das ist so ähnlich wie ein Interface.

Aber hier ist ein Tutorial zu dem Thema mit Sourcecode

Genau. Du hast mich richtig verstanden. Werde ich mir gleich mal antun. thx

Der ursprüngliche Beitrag von 10:43 Uhr wurde um 11:27 Uhr ergänzt:

Unicate schrieb:
Also wenn ich Dich richtig verstehe, ist dein Problem das du nicht weisst wie du dem Service mitteilst das er diese Jobs starten soll.

Dazu musst du ein aidl-file erstellen. Das ist so ähnlich wie ein Interface.

Aber hier ist ein Tutorial zu dem Thema mit Sourcecode

Trotzdem noch ne kurze Frage. Wenn ein Service in der gleichen App definiert ist wie die Activities, läuft der dann auch in einer anderen Sanbox? Ist es nicht so, dass alles von einer App in der selben VM laufen? Braucht das wirklich IPC, reicht nicht Broadcast und Indents? Die Annahme das es IPC braucht bringt so einiges an Verständnis bei mir durcheinander. :smile:
 
Services und Activities laufen normalerweise in einem Prozess (aber in unterschiedlichen Threads). Es sei denn du sagst dem Service das er ein remote Service ist. Dann läuft der in einem eigenen Prozess.

Deswegen brauchst du Theoretisch nur die IPC, wenn du einen remote prozess hast. (Siehe Anhang aus "Arno Becker" und "Marcus Pant"'s Android Grundlagen, dpunkt.verlag 2009)
 

Anhänge

  • PHOTO_1340963558369.jpg
    PHOTO_1340963558369.jpg
    306,2 KB · Aufrufe: 167
Intents und Broadcastreceiver verwendet man wenn man zwischen 2 verschieden Applikationen etwas machen möchte
 
Ich habe also keine Prozessgrenzen. Ich müsste also nicht mit IPC arbeiten. Aber wie dann? Statische Methode auf dem Prozsess wo ich was übergeben kann? MyProcess.startJob("job a");
 
Das wäre natürlich eine Möglichkeit. Besonders schön ist das allerdings nicht.

Du kommst um die aidl files (stub interfaces) nicht drumherum. Warum das so ist, kann ich Dir leider nicht sagen. Wenn uns da jemand erleuchten könnte, wär das gut.

Mein persönliche Erfahrung:

Wenn ich Services verwendet habe, habe ich das prinzipiell über aidl interfaces gemacht. Alle selbst erzeugten Klassen die übergeben werden sollen müssen dann das Parcelable Interface implementieren, welches aber bei einem Local Service ignoriert(mehrfach getestet) wird. Bei einem Remote Service wird es dann verwendet. (Dort macht es ja auch tatsächlich Sinn. IPC und so..)

Das wiederum hat einen Vorteil. Wenn man nämlich mal schnell seinen Service remote machen möchte/muss, dann muss man das nur noch im Manifest angeben.

Ich kenn aber auch keine andere Möglichkeit dem Local Service einen call zu geben...
 
  • Danke
Reaktionen: GENiALi
Ich hab bei noch keinem lokalen Service aidl gebraucht. Daten in einen Intent packen und Context.startService() reicht doch?

Gesendet von meinem MB525 mit Tapatalk 2
 
Und wie reichst du Daten nach, wenn der Service schon läuft? Einfach neuer Intent?
 
  • Danke
Reaktionen: GENiALi
Unicate schrieb:
Und wie reichst du Daten nach, wenn der Service schon läuft? Einfach neuer Intent?

Genau, und die Daten verarbeite ich z. B. in einem AsyncTask. Hier ist ein Beispiel für einen Service, den ich verbrochen habe ;)

Die eigenen Klassen kann man ja trotzdem Parcelabele implementieren lassen, da bekommt man sie gleich schön in den Intent rein.

Gesendet von meinem MB525 mit Tapatalk 2
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Unicate und GENiALi
Gute Idee, falls man keine Callbacks braucht!
 
Absolut genial. Funktioniert wie gewünscht.

Activity:
Code:
case R.id.btnStartService:
    Intent intent = new Intent(Main.this, PitService.class);
    intent.setAction(PitService.ACTION_ONE);
    startService(intent);
    break;
case R.id.btnStartService2:
    Intent intent2 = new Intent(Main.this, PitService.class);
    intent2.setAction(PitService.ACTION_TWO);
    startService(intent2);
    break;
Service:
Code:
public int onStartCommand(Intent intent, int flags, int startId)
{
    if (intent != null && intent.getAction() != null)
    {
        if (intent.getAction().equals(ACTION_ONE))
        {
            Toast.makeText(this, "Service One", Toast.LENGTH_SHORT).show();
        }
        if (intent.getAction().equals(ACTION_TWO))
        {
            Toast.makeText(this, "Service Two", Toast.LENGTH_SHORT).show();
        }
    }
    return START_NOT_STICKY;
}
 

Ähnliche Themen

A
Antworten
1
Aufrufe
571
swa00
swa00
SpeedySix
Antworten
13
Aufrufe
1.388
jogimuc
J
M
Antworten
2
Aufrufe
612
Mozart40
M
Zurück
Oben Unten