2013-07-15 9 views
8

Mi chiedo se potrei condividere un singleton sul contesto dell'applicazione tra più applicazioni? Ogni applicazione sarebbe nel suo APK ma potrebbe sembrare un'architettura scadente, ma prima ascoltami.È possibile che più applicazioni Android condividano un singolo contesto di processo e applicazione?

Il motivo per cui vorrei farlo è perché ho una libreria esistente che controlla un dispositivo esterno tramite Bluetooth. La libreria è java ma sotto le copertine vi è l'attributo di nativo (c/C++) tutto racchiuso da java. Ho cercato di mettere tutto questo in un servizio, ma l'IPC (stavo usando aidl) diventa molto ingombrante velocemente. Cercare di ridurre l'oggetto alle primitive è quasi impossibile (campi privati, puntatori jni ecc.) E provare a racchiudere tutto con AIDL è molto complicato.

Se ciascuna applicazione può essere eseguita nello stesso processo e avere lo stesso contesto applicativo, mi consente quindi di mantenere un oggetto Singleton lì che renderebbe le cose molto più semplici. Il mio googl-fu mi sta fallendo su questo. Forse non è possibile?

risposta

8

Sì, possono. Devi solo assegnare gli stessi valori a android:sharedUserId e android:process in entrambe le applicazioni e firmarli con lo stesso certificato.

Link correlati:

+0

Come specificare il contesto dell'applicazione personalizzato per consentire un singleton? Suppongo che Android: il nome abbia qualcosa a che fare con esso, ma cosa garantisce che siano effettivamente la stessa classe? – startoftext

+0

@startoftext l'hai capito? Voglio fare la stessa cosa – Alan

+0

Dovrebbe essere opportuno impostare sharedUserId e firmare entrambe le app con lo stesso certificato. android: attributo di processo utilizzato per ulteriori elementi extra come la denominazione o l'indirizzamento al processo corretto. – zgulser

5

Dovrebbe essere possibile, ma si incorrerà in problemi con il fatto che si sta ancora eseguendo due differenti APK, ognuno ha il proprio ClassLoader. Poiché la stessa classe caricata da ClassLoader diversi è considerata completamente diversa l'una dall'altra, non è possibile creare una classe dall'APK A e aspettarsi che l'APK B sia in grado di accedere alla stessa classe. Tuttavia, una lacuna è che Android sistema classi nello stesso processo vengono sempre caricati dalla stessa ClassLoader, quindi la soluzione è quella di memorizzare i dati tramite Android sistema classi (ad esempio System.set/getProperty). Puoi leggere un eccellente articolo su questa tecnica here.

Dato che si desidera memorizzare dati più complessi rispetto alle primitive Java e considerando l'approccio di cui sopra, si limita notevolmente la struttura dei dati che è possibile memorizzare, tuttavia è possibile che AIDL sia la soluzione migliore. Ma almeno i tuoi dati non devono attraversare i limiti del processo se inserisci entrambi gli APK nello stesso processo, quindi dovrebbe essere ragionevolmente efficiente.

Problemi correlati