2013-07-18 14 views

risposta

24

In base al documento ufficiale, onServiceDisconnected() verrebbe chiamato se il servizio si arrestasse in modo anomalo o venisse ucciso. Link http://developer.android.com/reference/android/content/ServiceConnection.html

Chiamato quando una connessione al servizio è stata persa. Questo di solito accade quando il processo che ospita il servizio è andato in crash o è stato ucciso. Ciò non rimuove lo stesso ServiceConnection: questo legame al servizio rimarrà attivo e riceverai una chiamata a onServiceConnected (ComponentName, IBinder) quando il servizio sarà in esecuzione.

+1

Ok. Quindi invierò un 'Broadcast' per notificare che il' Service' si è fermato. – jul

+0

Se si associa al servizio allora si può solo inviare un avviso e poi chiamato stopSelf() –

+0

'stopSelf()' viene chiamato direttamente nel 'Service' (quando non c'è più il download di fare), non con un metodo da l'attività. – jul

21

inviando semplicemente una notifica a un cliente legato e chiamando stopSelf() (o stopService()) non sarà effettivamente realizzare ciò che si sta cercando di fare. Devi chiamare unbindService() nel client associato (e il servizio non deve avere altri client associati) per distruggere effettivamente il servizio.

Esistono due tipi di servizi, servizi "avviati" e servizi "vincolati". Non si escludono a vicenda. Se hai avviato il servizio utilizzando startService(), hai un servizio "avviato". Se si avvia il servizio tramite bindService(), viene associato. Se ti leghi al servizio e usi anche startService(), è entrambi. Quindi ci sono tre opzioni possibili per la gestione del ciclo di vita di un servizio:

1) Servizio avviato: per chiamare il numero startService() per avviarlo; il servizio verrà interrotto chiamando il numero stopService() o stopSelf().

2) Servizio associato: chiamate bindService() e passate nella bandiera BIND_AUTO_CREATE. Altri clienti possono legare e disassociare al servizio a volontà, il servizio verrà automaticamente distrutto quando tutti i clienti si saranno separati. In questo caso, chiamare stopService() o stopSelf() non ha alcun effetto.

3) Combo: i client si collegano al servizio e si è anche chiamato startService(). In questo caso, chiamando stopSelf() o stopService() distruggerà il servizio solo dopo che tutti i client si saranno separati. Allo stesso modo, il servizio non verrà distrutto automaticamente quando tutti i client si sono staccato, fino a quando non sono stati chiamati stopSelf() o stopService().

La documentazione per il ciclo di vita dei servizi di combo dice:

Questi due percorsi non sono completamente separati. Cioè, è possibile associare a un servizio già avviato con startService(). Ad esempio, è possibile avviare un servizio di musica di sottofondo chiamando lo startService() con un Intento che identifica la musica da riprodurre.Più tardi, forse quando l'utente vuole esercitare un certo controllo sul giocatore o ottenere informazioni sul brano corrente, un'attività può legarsi al servizio chiamando bindService(). In casi come questo, stopService() o stopSelf() in realtà non interrompe il servizio finché tutti i client non si separano.

Quindi nel tuo caso, hai un cliente associato. La chiamata a stopSelf() non disconnette forzatamente i client associati, pertanto è necessario notificare esplicitamente al client che il servizio desidera arrestarsi, e quindi il client deve chiamare unbindService() prima che il servizio venga distrutto. Puoi farlo in molti modi, semplicemente attraverso una trasmissione o un'interfaccia IBinder, o un messenger o AIDL se comunichi con il tuo servizio attraverso i processi.

+0

Interessante, grazie. Quindi, quando chiamo 'stopSelf()' dal mio 'Servizio', devo anche inviare un' Broadcast' al mio cliente per dirgli di smetterla. – jul

+0

Ottima spiegazione, grazie. –

Problemi correlati