2009-05-28 4 views
5

Ho lavorato con Android per oltre un anno, ma ho ancora difficoltà a determinare quando devono essere utilizzati diversi tipi di messaggistica/comunicazione tra processi/thread. Sto principalmente parlando di Broadcast Intents, usando AIDL per services, usando gli Handler per inviare messaggi e comunicazioni socket.Quando dovrei utilizzare ciascuno dei diversi tipi di messaggi di Android?

Molti di questi strumenti possono essere utilizzati per svolgere attività simili, ma che è più adatto a situazioni particolari?

risposta

14

Questa è una domanda piuttosto aperta, ma vorrei fare un tentativo di descrivere come vedo meglio la comunicazione intra/inter applicazione.

Uno degli aspetti chiave della messaggistica di Android è il concetto di tutti i componenti dell'applicazione che si collegano liberamente. Poiché tutte le applicazioni vengono eseguite in un processo separato e una "app" può essere costituita da più applicazioni (responsabili della fornitura di attività o servizi diversi), le tecniche di messaggistica si basano tutte sull'idea di eseguire il marshalling dei messaggi oltre i limiti del processo.

Intents

La tecnica preferita per i messaggi, cerca sempre di utilizzare un intento quando possibile. È il modo più "nativo" per trasferire i messaggi all'interno di Android.

Vantaggi

utilizzo degli intenti per la messaggistica mantiene il legame allentato di componenti dell'applicazione, che consente di trasferire i messaggi senza soluzione di continuità tra le diverse applicazioni. Gli intenti sono utilizzati pesantemente nel sistema principale per avviare attività e servizi e per trasmettere e ricevere eventi di sistema.

Uso extra bundle è possibile includere le coppie chiave/valore di primitive come carico utile di dati all'interno di Intenti per passare facilmente le informazioni da un componente un'applicazione all'altra - anche se tali componenti sono in esecuzione in diversi processi.

Svantaggi

Perché Intenti sono progettati per andare tra i processi, il carico utile extra supporta solo tipi primitivi. Se devi inviare un oggetto usando un Intento, devi decostruirlo in primitivi da un lato e ricostruirlo dall'altro.

classe Application

Se solo si desidera comunicare all'interno di una singola applicazione in esecuzione in un singolo processo questa è una soluzione a portata di mano.

Vantaggi

estendendo la classe Application (e la sua attuazione come Singleton) si ottiene un oggetto che esisterà ogni volta che uno dei tuoi componenti dell'applicazione esistono, fornendo un luogo centralizzato per memorizzare e trasferire dati oggetto complesso tra i componenti dell'applicazione.

Svantaggi

Questa tecnica limita la messaggistica ai componenti all'interno di una singola applicazione.

Servizio Binding, IPC, e AIDL

Binding a un servizio consente di accedere ai relativi metodi e oggetti di scambio con esso. AIDL è un modo per definire come serializzare un oggetto in primitive del sistema operativo in modo che possa essere eseguito il marshalling oltre i limiti del processo se il servizio a cui si sta vincolando è in esecuzione in un'applicazione separata.

Vantaggi

Quando si associa ad un servizio che avete accesso ad esso come se fosse un oggetto all'interno della classe di chiamata. Ciò significa che è possibile eseguire metodi sul Servizio e scambiare oggetti ricchi con esso.

Si noti che se si esegue l'associazione a un servizio in un processo di applicazione diverso, sarà necessario creare le definizioni AIDL che indicano a Android come serializzare/deserializzare qualsiasi oggetto che si desidera passare tra le applicazioni.

Svantaggi

Creare le classi AIDL per IPC è un po 'di lavoro extra, e vincolante crea ulteriori dipendenze tra i servizi e le attività che possono rendere più difficile per il kernel per ripulire le risorse quando altre applicazioni sono in corso fame.

I messaggi di marshelling oltre i limiti del processo sono tuttavia costosi. Quindi, se non stai eseguendo metodi su un servizio, l'utilizzo di binding e IPC è probabilmente eccessivo - vedi se puoi ottenere la stessa cosa usando Intents.

Sockets

Se stai ricorrere a socket per comunicare all'interno o tra le applicazioni in esecuzione su un singolo dispositivo, è sia perché non c'è altro modo o ti sei perso un trucco da qualche parte. Se i messaggi lasciano il dispositivo, le prese sono un'alternativa valida e veloce. Se rimani nelle possibilità del dispositivo, Intents o IPC saranno un'opzione migliore.

+0

+1 questa è una risposta ideale che può essere utilizzata come risposta standard in tutta la comunità ..... – aProgrammer

1

I miei 2 centesimi

  • non ho usato i socket locali. Sembra eccessivo, poiché è necessario generare e analizzare i dati tramite .
  • Intenti sono sia per cose che altre applicazioni potrebbero voler fare (lancio me in una finestra di composizione o di scegliere qualcosa)
  • AIDL/Pacchi/gestori per avere un colloquio GUI per un processo senza testa che è in esecuzione costantemente. A seconda della l'applicazione potrebbe trasferire molti dei dati effettivi utilizzando un fornitore di contenuti ma io tendo ad avere alcuni dati che devono essere trasferiti all'esterno di di quel canale.
2

Tutto dipende il caso d'uso e il tipo di applicazione.Se l'applicazione è in esecuzione tutto il tempo meglio per andare con l'approccio AIDL in quanto è il modo più sicuro per comunicare. Se l'applicazione non ha bisogno di essere eseguita continuamente, è possibile seguire l'approccio broadcast o l'approccio in attesa di comunicazione tra le applicazioni.

Problemi correlati