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

Frage zu Service

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von GENiALi, 28.06.2012.

  1. GENiALi, 28.06.2012 #1
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    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?
     
  2. Unicate, 29.06.2012 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Geht alles, solltest warscheinlich nur günstig Threaden.
     
  3. GENiALi, 29.06.2012 #3
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    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.
     
  4. Unicate, 29.06.2012 #4
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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
     
  5. GENiALi, 29.06.2012 #5
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    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.
     
  6. Unicate, 29.06.2012 #6
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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
     
    GENiALi bedankt sich.
  7. GENiALi, 29.06.2012 #7
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    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:

    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:
     
  8. Unicate, 29.06.2012 #8
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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:

  9. Unicate, 29.06.2012 #9
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Intents und Broadcastreceiver verwendet man wenn man zwischen 2 verschieden Applikationen etwas machen möchte
     
  10. GENiALi, 29.06.2012 #10
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    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");
     
  11. Unicate, 29.06.2012 #11
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    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...
     
    GENiALi bedankt sich.
  12. maniac103, 29.06.2012 #12
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    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
     
  13. Unicate, 30.06.2012 #13
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Und wie reichst du Daten nach, wenn der Service schon läuft? Einfach neuer Intent?
     
    GENiALi bedankt sich.
  14. maniac103, 30.06.2012 #14
    maniac103

    maniac103 Android-Lexikon

    Beiträge:
    1,237
    Erhaltene Danke:
    1,157
    Registriert seit:
    24.01.2011
    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: 30.06.2012
    Unicate und GENiALi haben sich bedankt.
  15. Unicate, 01.07.2012 #15
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Gute Idee, falls man keine Callbacks braucht!
     
  16. GENiALi, 02.07.2012 #16
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    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;
    }
     

Diese Seite empfehlen