1. GENiALi, 28.06.2012 #1
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    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

    Geht alles, solltest warscheinlich nur günstig Threaden.
     
  3. GENiALi, 29.06.2012 #3
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    Gute Idee, falls man keine Callbacks braucht!
     
  16. GENiALi, 02.07.2012 #16
    GENiALi

    GENiALi Threadstarter Erfahrener Benutzer

    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;
    }
     
Du betrachtest das Thema "Frage zu Service" im Forum "Android App Entwicklung",