nochmal broadcast und activity

  • Hallo zusammen,
    was ist sinnvoller,
    die Activity teilt dem service mit, "ich bin da",
    oder der Service prüft, ob die Activity aktiv ist?


    wenn 2teres, wie kann ich feststellen, ob die Activity gerade aktiv ist ?


    Ich danke euch
    Nachtrag:
    oder der broadcast funktioniert auch ohne dass die activity aktiv sein muss ??

  • Wie bereits angedeutet nutze ich dieses Konzept unter dem Namen 'Notifications' ganz rege unter iOS, ich weiß daher nicht, ob und wie sich das Ganze in Android so umsetzen lässt.


    Jedenfalls habe ich halt eine Klasse, die komplett static arbeitet: Listener registrieren, Broadcast senden, Listener entfernen.
    Ein Broadcast ist bei mir einfach ein Objekt mit einem Namen, einem Sender und einer Map<String,Object>, die weitere Infos enthält.
    Ein Listener ist bei mir ein Interface, welches lediglich die Methode 'receivedBroadcast(Broadcast)' implementiert.


    Damit das mit den Listenern einigermaßen funktioniert, habe ich noch eine Klasse, die aus Listener, Namen und Sender eine Zuordnung zusammenleimt.


    Diese static Klasse nimmt also den Broadcast, er auf ihre send(Broadcast) Methode gelegt wurde.
    Dann prüft sie einfach, welcher Listener für diesen Absender und/oder diesen Namen registriert ist und ruft dessen receivedBroadcast() Methode auf.


    Sofern das Ein- und Aushängen der Listener sauber funktioniert, läuft das alles ganz rund.


    ---


    Nachdem diese Gegebenheiten abgesteckt sind, ist dann die Lösung deines Problems ziemlich simpel:
    Deine Activity registriert sich für alle Broadcasts des Senders 'Service', den sie hoffentlich kennt. (Falls nicht hängst du für jeden möglichen Namen des Broadcasts einen Listener ein.)
    Dein Service registriert sich für alle Broadcasts des Namens "SomeActivityDidChangeSharedPreferences".


    Passiert im Service irgendwas, sendet er irgendwas an deinen Broadcaster.
    Passiert in der Activity irgendwas, sendet sie irgendwas an deinen Broadcaster.


    So bleibst du dann recht dynamisch. Baust du noch was in den Service ein bekommt deine Activity auch das mitgeteilt.
    Änderst du über eine andere Activity irgendwas Wichtiges an den SharedPreferences, bekommt dein Service auch das mitgeteilt.


    Ein typischer man-in-the-middle. ^^

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Na, das Eine hat aber mit dem Anderen eher weniger zu tun. ;)


    Also in meinem Fall wäre es ein simples

    Java
    Map<String, Object> userInfo = new HashMap<String, Object>();
    userInfo.put("newLocation", location);
    Broadcaster.send(new Broadcast("LocationDidChange", this, userInfo);


    Activityübergreifend wirst du keine Location übergeben bekommen. Das kotzt mich persönlich ja sowas von dermaßen an... +sigh+


    Als Extra kannst du nur Parcelable und Serializable Objekte reinstopfen. (Ärgert mich gerade auch ganz extremst, weil ich mein Design auf den letzten 20% mal wieder komplett über den Haufen werfen kann)


    Der Nachteil ist, dass in beiden Fällen wie folgt vorgegangen wird:
    Objekt wird genommen, Objekt wird zerlegt, Objekt wird zusammengepackt, Paket wird übergeben, Paket wird genommen, Paket wird zerlegt, neues Objekt wird erstellt, Paketinhalte werden neuem Objekt zugewiesen.


    In meinem Fall (knapp 500 Objekte, die ich in einer List übergeben wollte) wird das ein unglaublicher Memory Overkill. Activities halten absolut nichts von Objektorientierung. -.-


    Also drei Möglichkeiten:
    - über eine Datenbank ausweichen
    - Eigenimplementation von Location die entweder das Parcelable oder das Serializable Interface implementiert
    - die wirklich relevanten Werte als primitive Datentypen übergeben


    Ein Fleißbienchen bekommst du für Möglichkeit vier:
    - herausfinden, wie man Speicheradressen weitergibt und einfach mit dieser Referenz arbeiten
    (So wie ich die Activities verstanden habe, ist das explizit nicht erwünscht, da diese Activities ja losgelöst voneinander funktionieren sollen und vermutlich zumindest applicationsweit einen eigenen Speicherbereich zugewiesen bekommen – die Speicherbereiche der anderen Activities für sie also schlicht nicht zugreifbar sind.)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!