2011-11-13 19 views
5

Ho un'app per Android, in cui le attività eseguono operazioni a esecuzione prolungata in esecuzione in background. Queste operazioni interagiscono con le attività una volta terminate. Sto sviluppando un componente che gestisce l'accoppiamento Activity/Long-Running-Task, avendo cura di attività distrutte e ricreate.Servizio Android di lunga durata

In questo momento il componente è implementato come servizio Android. Le attività chiamano bindService e usano l'IBinder risultante per avviare e tenere traccia delle attività. Ho deciso di non utilizzare startService, perché preferisco l'API più ricca possibile attraverso un'interfaccia Java.

Ora il problema. Attività A si avvia, si collega al servizio e chiama serviceApi.runTask (...). L'attività A viene quindi distrutta (perché l'utente capovolge il telefono, ad esempio) e ricreata come Attività A '. Un 'allora si lega nuovamente al servizio, annuncia la sua esistenza e tutto dovrebbe funzionare bene.

Tranne che il mio servizio viene distrutto. Quando l'attività A viene distrutta, si separa dal servizio. Android vede che non ci sono più clienti e uccide il servizio. Quando viene creata l'attività A ', il servizio viene nuovamente creato e io perdo tutto ciò che il vecchio servizio aveva.

L'unica soluzione che riesco a vedere è l'utilizzo di un singleton per il servizio. E quindi non deve essere necessariamente un servizio Android, solo un'istanza accessibile a tutti. È accigliato in Android? Esiste un design migliore adatto a questo problema?


Editted: Anche se io chiamo StartService e quindi associare ad esso, nulla garantisce che l'istanza del servizio esisterà fino a quando l'applicazione è in esecuzione. Android può uccidere i servizi appiccicosi se le risorse sono basse. Uccidere il servizio causerà il malfunzionamento dell'applicazione, e non posso averlo.

risposta

7

Anche se chiamo StartService e quindi associare ad esso, nulla garantisce che l'istanza del servizio sarà esistono finché l'applicazione è in esecuzione.

Corretto.

Android può uccidere i servizi appiccicosi se le risorse sono basse.

Correggere anche. Tutto "appiccicoso" significa che Android potrebbe riavviare il servizio.

La soppressione del servizio causerà il malfunzionamento dell'applicazione e non è possibile.

È impossibile creare un servizio garantito per l'eternità.Per i principianti, gli utenti possono sbarazzarsi del servizio quando vogliono, perché gli utenti detestano gli sviluppatori che hanno servizi inutili che durano per sempre. La scrittura di servizi eterni è necessaria solo in pochissimi casi; altrimenti, è solo una programmazione sciatta.

L'unica soluzione che riesco a vedere è l'utilizzo di un singleton per il servizio. E quindi non deve essere necessariamente un servizio Android, solo un'istanza accessibile a tutti. È accigliato in Android?

Singletons (a.k.a., membri di dati statici) andranno via quando il processo è terminato. Il processo verrà terminato alla fine, in particolare se non ci sono servizi attivi e nessuna delle attività è in primo piano.

+0

Grazie, Commonware. Il componente (per mancanza di una parola migliore) ho solo bisogno di essere eseguito mentre il processo dell'applicazione è attivo e in esecuzione e l'utente lo sta usando. Una volta che l'utente ha chiuso l'appicazione, il componente può essere spento, poiché il suo unico scopo è quello di coordinare le attività relative all'II asincrone nel processo. Ho bisogno di un servizio che verificherà periodicamente il server per gli aggiornamenti (non ho ancora deciso su C2DM). Lo implementerò come servizio di breve durata che si spegne dopo il polling. – zmbq

0

Yo deve creare un servizio permanente. Fare riferimento a this manual.

In poche parole: non chiamare bindService, chiamare startService.

Problemi correlati