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.
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