2011-08-22 48 views
30

Ho questo file AndroidManifest.xml:L'utilizzo di Android: processo

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
android:versionCode="1" android:versionName="1.0.0.0721" 
android:process="com.lily.process" package="com.lily.test"> 

    <provider android:authorities="com.lily.test" 
     android:name="com.lily.test.provider" 
     android:process="com.lily.process"> 
    </provider> 

: viene aggiunto "Android processo" sia tag tag e provider come manifesti, so che se si aggiunge come un tag fornitore, la il provider può essere eseguito nel processo "com.lily.process". Ma a cosa serve quando viene scritto come tag manifest? Ho provato, ma non tutti i componenti potrebbero essere in esecuzione nel processo identificato.

+0

sembra che tu abbia un pacchetto aggiuntivo nel nome del fornitore "com.com" – CrackerJack9

risposta

93

Sono d'accordo che non molti avrebbero trovato Android: processo per essere utile come un attributo del tag dell'applicazione. Tuttavia, ho trovato utile come attributo del tag attività.

Lo scopo di android:process su un'attività è specificare che l'attività deve essere avviata in un processo con un nome specifico. La scelta di quel nome può essere utilizzata per isolare l'attività nel proprio processo (diverso da quello che l'ha lanciato), o per forzarla a convivere in un singolo processo con altre attività che utilizzano lo stesso nome.

Per la Guida Dev (http://developer.android.com/guide/topics/manifest/activity-element.html):

"Se il nome assegnato a questo attributo inizia con i due punti (':'), un nuovo processo, privato a l'applicazione, viene creato quando è necessario e la l'attività viene eseguita in quel processo Se il nome del processo inizia con un carattere minuscolo, l'attività verrà eseguita in un processo globale con quel nome, a condizione che abbia il permesso di farlo. Ciò consente ai componenti di diverse applicazioni di condividere un processo, riducendo la risorsa utilizzo."

Recentemente ho trovato che questo attributo è utile per risolvere un problema che ho avuto con l'avvio di un'attività di aiuto per un'app che, in determinate circostanze, era abbastanza vicino al limite di 16 MB di heap che si applica ancora ad alcuni dispositivi. Avviare la sua attività di aiuto è stato, in quelle situazioni, spingere la mia app oltre il limite, determinando una chiusura forzata.

Utilizzando il tag android:process, sono stato in grado di specificare che la mia attività di guida deve essere avviata in un processo separato a sé stante. Questo processo ha il suo stesso heap da 16 MB e non è stato contato rispetto all'heap della mia app principale che l'ha lanciato. Questo ha impedito permanentemente e completamente alla mia app di esaurire lo spazio heap e di bloccarsi quando è stato avviato l'aiuto.

Se il lancio applicazione ha il nome del pacchetto

com.mycompany.mymainapp 

ed è quindi assegnato un nome processo che è la stessa stringa, quindi, se si utilizza

android:process=":myhelp" 

sulla vostra attività lanciato, esso verrà assegnato il nome del processo

com.mycompany.mymainapp:myhelp 

e tale processo avrà il suo, separa l'ID del processo, che è possibile visualizzare (ad esempio in DDMS).

Questa, almeno, è stata la mia esperienza. Il mio test è stato finora eseguito su un vecchio Moto Droid con CM6 (Android 2.2.1), configurato per avere un limite di heap di 16 MB.

Nel mio caso, dal momento che non volevo l'utente a percepire l'aiuto come separato dalla mia app, ho inserito l'attributo

android:excludeFromRecents="true" 

per evitare che l'attività di aiuto di apparire sulle recenti applicazioni (lunga -press Home) elenco. Ho incluso anche

android:taskAffinity="com.mycompany.mymainapp.HelpActivity" 

dove HelpActivity è il nome dell'attività di aiuto, di separare l'attività in proprio compito

ho anche aggiunto:

android:launchMode="singleInstance" 

per evitare più istanze di questa applicazione da essere creato ogni volta che l'utente ha richiamato l'aiuto.

Ho anche aggiunto la bandiera:

Intent.FLAG_ACTIVITY_NEW_TASK 

l'intento usato per lanciare l'attività di aiuto.

Questi parametri possono o non possono essere necessari, a seconda dell'utilizzo che si sta facendo dell'attributo android:process.

Considerando quanto spesso si incontrano limiti di memoria durante lo sviluppo per dispositivi Android, disporre di una tecnica che, in alcuni casi, consente di suddividere parti della propria app in processi separati, ciascuno con il proprio heap, sembra un meraviglioso regalo. Ci possono essere pericoli nascosti nel fare ciò che non ho ancora considerato o sperimentato, ma finora, così buono, nel mio caso particolare.

+0

Grazie per la tua risposta, questo è stato molto utile! Mi chiedo se potresti far luce su come i processi remoti vengono uccisi quando un utente fa scorrere l'applicazione nell'interfaccia utente delle "app recenti". Ho letto [questa domanda] (http://android.stackexchange.com/questions/19987/what-actually-happens-when-you-swipe-an-app-out-of-the-recent-apps-list#_ = _) e sono curioso di vedere se hai riscontrato lo stesso comportamento. –

+0

@Steven: è molto interessante; Non avevo affatto saputo di quel comportamento. La filosofia di Android è stata generalmente quella di consentire al sistema operativo di decidere, tranne quando l'utente utilizza il pulsante Indietro per uscire completamente da un'app. Ho appena provato a eseguire la mia app https://play.google.com/store/apps/details?id=com.goalstate.WordGames.FullBoard.trialsuite (che utilizza questo approccio per la sua Guida) e a eliminare il principale il processo dell'app o il processo di aiuto sembrano ucciderli entrambi (anche se l'altro rimane nell'elenco di quelli usati di recente). Potresti provare questo durante l'esecuzione di DDMS per essere sicuro. – Carl

+0

Capisco lo sforzo che hai speso per nascondere l'attività dei Recenti. Ma non dovrebbe avere nulla a che fare con l'inflazione di un nuovo processo? – zgulser

5

@Carl

pericoli

Ci possono essere nascosti:

  • memoria non può essere rilasciato quando c'è un servizio in background (ad es: android: processo = ": Myhelp") nello stesso processo.
  • Il modello Singleton non può essere utilizzato.

Rif: http://developer.android.com/training/articles/memory.html#MultipleProcesses

il processo è ormai quasi triplicato le proprie dimensioni, a 4 MB, semplicemente mostrando del testo nell'interfaccia utente. Ciò porta a una conclusione importante: se si è intenzione di dividere l'app in più processi, solo un processo dovrebbe essere responsabile dell'interfaccia utente. Altri processi dovrebbero evitare qualsiasi UI, poiché lo aumenterà rapidamente la RAM richiesta dal processo (in particolare dopo aver iniziato a caricare risorse bitmap e altre risorse). Potrebbe quindi essere difficile o impossibile ridurre l'utilizzo della memoria una volta che l'interfaccia utente è stata disegnata.

+0

Nel mio caso, l'utente accede alla guida dall'attività principale dell'app e in genere esce dalla procedura di aiuto una volta che l'aiuto è stato consultato, ritornando all'attività principale e al suo processo. Quindi, per un po 'di memoria extra durante la visualizzazione della guida, funziona molto bene. E ovviamente il mio processo di aiuto riguarda l'interfaccia utente, ma questo non crea problemi. Credo che se l'utente dovesse passare direttamente dalla visualizzazione di aiuto a un'altra app, il sistema operativo sarebbe in grado di scaricare i due processi della mia app dalla memoria per fornire memoria, se necessario, da quell'altra app. – Carl

+0

Notare che il processo di guida nel mio esempio non è un servizio; è un'attività. Inoltre, il processo di aiuto non fa uso di oggetti creati nel processo principale, quindi non c'è nulla che impedisca l'uso di un pattern singleton all'interno del mio processo principale, e infatti io uso quel pattern. – Carl

Problemi correlati