Új hozzászólás Aktív témák

  • Karma
    félisten

    Van egy klassz keyboard-om, ami alapvetően egy service. Ehhez készítettem egy preferences-t. Néhány esetben azonban a preferencesnek (Activity) meg kéne hívni a Service-t, hogy figyelmeztesse a változásra.
    Erre szolgálna a bind, ha minden igaz.

    Olvastam viszont egy ötletet: [How to have Android Service communicate with Activity], mely szerint a service, mint singleton készít magáról egy static módon hozzáférhető referenciát. Vagyis: lesz egy Service getInstance() metódusom, ami vagy a futó a service-t, vagy null-t ad vissza.

    Nekem szimpatikus az ötlet, ráadásul kb. két sorból megoldható. De mégis van valami "rossz érzésem" vele kapcsolatban. Minek csinálták a bind-et, ha ez ilyen egyszerű? Hibára azonban nem jöttem rá, a hozzászólást meg elfogadták.

    Véleményetek szerint szabad ezt így használni?

    ((apropó, akkor itt is javítsam a PreferenceFragment-et PreferenceFragmentCompat-ra?))

    Nem elfogadták, hanem a kérdező egyszemélyben fogadta el a választ. Nem mindegy, mert egyáltalán nem biztos, hogy helyes is. Amellett, hogy 2010-ben készült, alapvetően elég súlyos hiba egy Contextre(*) static változóval hivatkozni, mert ezzel keresztülhúzod az életciklusát.

    (*): Az Application egy kivétel ez alól, mert processzenként csak egy jön létre biztosan.

    Ha a Service-ed példányával akarsz közvetlenül kommunikálni, akkor a Binder erre a megoldás, amit egyébként szintén pár sorral le lehet tudni. Még csak nem is agysebészet, kell egy Binder subclass, az onBind metódus a Service oldalon; egy ServiceConnection és a bindService/unbindService hívás az Activity oldalon.

    Ha nem közvetlenül akarsz vele beszélni, akkor pedig ott vannak az Intentek és a BroadcastReceiverek - a Service is simán regisztrálhat egyet amikor életben van -; vagy Ottót ill. EventBust is használhatsz. Mondjuk csak ehhez a feladathoz overkill egy külső libet behozni.

    vlevi: Egy kicsit összekeverted a dolgokat. Nem ezek a service-ek típusai.

    1) Vannak a bound service-ek, amik ahogy írtad, a bindService hatására élednek, és leállnak amikor lecsatlakozott az utolsó kliens.

    2) Vannak a started service-ek, amik egy startService(Intent) hatására indulnak; eldönthetik, hogy leállnak-e, futnak tovább, vagy úgy futnak tovább, hogy ha bármi miatt lehalnának, a rendszer akkor is indítsa vissza őket (sticky). Ettől független dolog az, hogy csak az alkalmazásodon belül, vagy kívülről is hívható-e (exported flag).

    3) Vannak még hibrid service-ek, amik olyan startedek, amikre bindolni is lehet. Ez a billentyűzet történet szerintem ebbe a kategóriába kellene, hogy essen.

    Az IntentService egy speciális started service ősosztály, ami arra szolgál, hogy egyszerűen tudj a háttérben végrehajtandó feladatokat sorban átadni neki, és majd leáll, amikor mindennel végzett. De ettől még nem lesz külön kategória.

Új hozzászólás Aktív témák