12

Ho scritto una libreria che avvia un servizio in background. Funziona perfettamente in tutte le applicazioni.Come eseguire un servizio Singleton (condiviso) in una libreria per più applicazioni?

Per ridurre l'utilizzo della RAM, voglio evitare di eseguire più servizi per diverse applicazioni. In realtà, è abbastanza bello usare solo un servizio per fare le cose.

In primo luogo, ho scritto un file AIDL per rendere IPC tra applicazioni/librerie. Definito il servizio come esportato/abilitato con autorizzazione della firma. Dal momento che tutte le applicazioni sono esattamente lo stesso servizio, non è possibile controllare se uno è in alto o in basso. Durante il binding del servizio per verificare le condizioni del servizio, crea sempre e distrugge il proprio servizio a causa della natura del flag BIND_AUTO_CREATE. Ecco perché non è possibile ottenere alcun tipo di informazioni dal servizio esportato se è veramente attivo e funzionante.

Quindi, ho provato a definire un provider di contenuti sul manifest della libreria. Il mio obiettivo è condividere le informazioni del servizio attraverso di esso. È davvero un buon meccanismo per comunicare tra il servizio esportato e il processo principale dell'applicazione. Ma non è utilizzabile per più istanze. Perché le applicazioni che ottengono le informazioni del fornitore di contenuti dalla libreria usano la stessa autorità e quindi non è possibile installare la seconda. Fornisce un errore DUPLICATE_PROVIDER_AUTHORITY.

Qual è il tuo suggerimento in merito al problema? C'è qualche opzione per creare un meccanismo master/slave? È possibile rendere il servizio singleton per l'applicazione utilizza il progetto della libreria?

P.S: tecniche di trasmissione condivise e preferenze condivise. Ma non sono efficaci per ascoltare la richiamata dal servizio esportato.

+0

saresti in grado di condividere la soluzione che hai trovato per favore? Anche se non era l'ideale per quello che volevi .... Hai detto in un commento "Ho completato la mia implementazione con i ricevitori di trasmissione (usando il permesso di firma)". Sarebbe interessante vedere come hai gestito questo. – brandall

risposta

5

È necessario inserire lo Service in un APK a se stante. Deve avere il proprio nome di pacchetto univoco (nel manifest) diverso dai nomi dei pacchetti di qualsiasi applicazione che lo utilizza. Ecco come si fa il Service come un singleton. Ora è possibile utilizzare AIDL e collegarsi allo Service per avere una comunicazione bidirezionale.

Si noti che nelle versioni più recenti di Android, si è reso necessario per avviare una Service utilizzando un esplicitoIntent (vale a dire: la Component deve essere specificato esplicitamente, non è possibile utilizzare solo un'azione).

+0

Grazie per la spiegazione. Ma io sono solo l'autore della biblioteca, non l'applicazione. La mia biblioteca offre una soluzione unica al cliente. Funziona bene sulla produzione in questo momento. Da parte mia, non c'è modo di conoscere i nomi delle applicazioni, i dettagli, ecc. Ogni cliente può usarlo nelle loro applicazioni. Ho bisogno di una soluzione dal lato della biblioteca. – StillHopeForMe

+0

In realtà, ho un meccanismo di controllo della vita tra i servizi nelle mie biblioteche tramite sistema di trasmissione. Ma voglio scrivere un codice più efficiente. – StillHopeForMe

+0

Non c'è niente che tu possa fare, allora. Dovrai vivere con più 'Service's, poiché non c'è modo di comunicare o conoscersi l'uno con l'altro. Alla fine avresti comunque un incubo di permessi/sicurezza. Scusate. –

0

Alternativa 1:

  • Se il caso d'uso permette penso che non si dovrebbe implementare il Servizio. Fai in modo che il tuo cliente esegua un servizio chiamando il tuo codice libreria. Questo è il modo in cui funzionano MediaPlayer e altre API Android predefinite.

Alternativa 2:

  • ospitare il servizio in un separato app..and scaricare l'applicazione quando la prima chiamata viene effettuata da qualsiasi client. Da qui in poi ci sarà il servizio singolo che gestirà tutte le richieste del cliente. Ecco come funzionano alcune API come adobe air/MDM di Airwatch.

Non esiste un modo valido per controllare un componente in esecuzione in altre app, a meno che non si utilizzino ricevitori broadcast e tutto.

+0

Ho completato la mia implementazione con i ricevitori broadcast (utilizzando il permesso di firma). Grazie per le tue soluzioni alternative. – StillHopeForMe

+0

@StillHopeForMe puoi elaborare la tua soluzione? –

Problemi correlati