Autore Topic: Corretto uso di bindService  (Letto 951 volte)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1182
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Corretto uso di bindService
« il: 24 Maggio 2015, 11:24:51 CEST »
0
Salve a tutti.

Ho un Service, col quale posso richiamare metodi avendo fatto il bind.
Metodi dell' Activity:
Codice (Java): [Seleziona]
@Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, MioService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

e mConnection
Codice (Java): [Seleziona]
 private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                                       IBinder service) {
            // We've bound to LocalService, cast the IBinder and get LocalService instance
            MioService.MioBinderbinder = (MioService.MioBinder) service;
            mioService= binder.getService();
            musicBound = true;
            Log.i(MainActivity.TAG,"onServiceConnected");
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            musicBound = false;
            Log.i(MainActivity.TAG,"onServiceDisconnected");
        }
    };

L'avvio funziona benissimo.
La "distruzione non tanto".

Pensavo che terminando l' app con uno swipe dal task manager venisse chiamato onUnBind() nel Service.
Devo salvare dei dati quando esso viene terminato.

Molte guide implementano l'Override di onDestroy() nell' Activity. Altri dicono che è sconsigliato. OnDestroy() viene chiamato solo quando si ha un esplicito .finish().
Il metodo onStop() non credo faccia al caso mio.
Siccome il Service è un musiPlayer, ho notato che tutti i player esistenti compreso quello di google, funziona fino a quando l'utente termina l'app (quindi notifiche cancellate e musica che termina), oppure quando preme stop sulla barra delle notifiche.

Non so come comportarmi. Vorrei sapere dove effettuare gli Override più giusti

iClaude

  • Visitatore
Re:Corretto uso di bindService
« Risposta #1 il: 24 Maggio 2015, 19:49:33 CEST »
0
Pensavo che terminando l' app con uno swipe dal task manager venisse chiamato onUnBind() nel Service.
Devo salvare dei dati quando esso viene terminato.

Non ho ben capito il problema...
Quando chiami unbindService dall'Activity nel Service viene chiamato onUnbind e poi onDestroy.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1182
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Corretto uso di bindService
« Risposta #2 il: 24 Maggio 2015, 20:03:42 CEST »
0
Esattamente questo è il punto.
Voglio capire dove devo chiamare  unbindService(). E quando devo chiamarlo. E quando effettivamente non devo chiamarlo.

iClaude

  • Visitatore
Re:Corretto uso di bindService
« Risposta #3 il: 24 Maggio 2015, 22:49:43 CEST »
0
Esattamente questo è il punto.
Voglio capire dove devo chiamare  unbindService(). E quando devo chiamarlo. E quando effettivamente non devo chiamarlo.

La risposta è molto semplice: quando la tua Activity non ha più bisogno di essere collegata al Service.
Al più tardi tipicamente nei metodi onPause / onStop / onDestroy.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1182
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Corretto uso di bindService
« Risposta #4 il: 24 Maggio 2015, 23:25:36 CEST »
0
OnStop non viene sempre chiamato e infatti mi sono documentato.

On pause non va bene. Se apro il browser il mio service deve rimanere attivo.
On stop sarebbe viene chiamato quando l' activity non è più visibile. Ma che differenza ha rispetto a onPause allora?

iClaude

  • Visitatore
Re:Corretto uso di bindService
« Risposta #5 il: 25 Maggio 2015, 08:54:14 CEST »
0
OnStop non viene sempre chiamato e infatti mi sono documentato.

On pause non va bene. Se apro il browser il mio service deve rimanere attivo.
On stop sarebbe viene chiamato quando l' activity non è più visibile. Ma che differenza ha rispetto a onPause allora?

onPause viene chiamato quando l'Activity e' parzialmente visibile, ad esempio quando si apre un'altra Activity (NB non finestra di dialogo) che occupa parte dello schermo, tipo finestra di dialogo.
Beh, allora non ti resta che onDestroy. Ricorda che esiste anche il metodo startForeground x fare in modo che il Service continui ad essere eseguito anche quando l'Activity principale viene distrutta.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1182
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Corretto uso di bindService
« Risposta #6 il: 25 Maggio 2015, 08:58:42 CEST »
0
Si ne ero a conoscenza. Ma ho guardato i comportamenti di altri player....ed essibe dico tutti, si arrestano quando viene chiusa l' activity. 
In onUnBind() del service dovrei salvare un valore e cancellare le notifiche.
Chiudendo l' activity con uno swipe non sempre onDestroy() viene chiamato. Non so per quale motivo. E soprattutto la meta delle volte onUnBind() non viene chiamato. Forse sono io che non ho ben chiaro il ciclo.

Ti ringrazio comunque delle veloci risposte

Offline tonno16

  • Utente storico
  • *****
  • Post: 1182
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Corretto uso di bindService
« Risposta #7 il: 04 Giugno 2015, 10:24:39 CEST »
0
Ho un altro dubbio? Dovrei accedere ai metodo del service anche nei frangment. Più che altro mi servono dei dati che poi visualizzo in apposite view nei fragment.

Ho letto che è sconsigliato fare il bind all'interno di ogni fragment. Come procedere? Mi aiuterebbe usare eventbus or otto? Il service emette degli eventi, i fragment devono riadattare le view coi nuovi dati presenti nel service tramite dei getter.

Non capisco come possa fare.

iClaude

  • Visitatore
Re:Corretto uso di bindService
« Risposta #8 il: 05 Giugno 2015, 10:24:29 CEST »
0
Ho un altro dubbio? Dovrei accedere ai metodo del service anche nei frangment. Più che altro mi servono dei dati che poi visualizzo in apposite view nei fragment.

Ho letto che è sconsigliato fare il bind all'interno di ogni fragment. Come procedere? Mi aiuterebbe usare eventbus or otto? Il service emette degli eventi, i fragment devono riadattare le view coi nuovi dati presenti nel service tramite dei getter.

Non capisco come possa fare.

Non conosco le librerie che hai citato. In ogni caso io evito di utilizzare librerie esterne per operazioni che possono essere facilmente implementate.
Nel tuo caso basta semplicemente usare il pattern observer: l'Activity si collega al Service e riceve le risposte, che poi comunica ai Fragment interessati. I dettagli ovviamente dipendono da come è strutturata la tua app e dai risultati che vuoi ottenere.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1182
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Corretto uso di bindService
« Risposta #9 il: 06 Giugno 2015, 00:43:05 CEST »
0
In pratica riesco a chiamare metodi pubblici sul mio service solo dopo il bind, che è asincrono. Passare dei dati da service ad activity e da essa al fragment riesco tramite fragment.nomeMetodo() essendo il fragment un oggetto.
Però io vorrei poter accedere ai metodo del service direttamente dal fragment. Per esempio. Se il service ha una lista, dopo il bind l' activity passa tale lista al fragment. Ed esso la usa con un adapter. Se clicco sulla lista il fragmebt dovrebbe tramite callback passare l' item cliccato. Ora l' activity informa il service chiamando service.nome metodo(itemcliccato).

Capisci che per fare una cosa elementare devi fare un leggero casino. Ecco perché vorrei avere acceso ai metodi pubblici anche nei fragment.

So che il service (bound) buon avere più client. Ma effettivamente 1 activitu più 5 fragment possono essere considerati 6 client? Leggo appunto che è sconsigliato effettuare il binder anche nei fragmebt.

Grazie per la risposta