2016-02-11 13 views
11

Una delle mie app presenta un grave problema di ricreazione delle attività in alcuni dispositivi Kitkat Samsung. Il problema si verifica più frequentemente quando si scattano foto e non si osserva in schifoso Jellybean Samsung s con metà della RAM. I registri mostrano una condizione di memoria insufficiente, sebbene non vengano lanciati i numeri OutOfMemoryException s. Penso che ci sia un criterio di chiusura delle attività più aggressivo in Kitkat (altrimenti l'app predefinita della fotocamera perde).Apertura della fotocamera in un altro processo

Mi chiedevo se il sistema operativo chiude le mie attività quando la memoria della mia app è alta, o invece le chiude quando la memoria totale utilizzata da tutte le app è alta. Se il sistema operativo avesse una soglia per processo, potrebbe essere utile aprire la videocamera in un processo diverso.

So che è possibile avviare un servizio nel proprio processo utilizzando l'attributo process nel manifest. Supponendo che non esista alcun attributo equivalente per Activities, se ho avviato un servizio proxy nel proprio processo e quindi avviato un'attività da questo servizio, l'attività verrà eseguita anche in questo processo?

+0

@Onik Bene, quei paragrafi sono lo sfondo. Forse c'è qualcuno là fuori che conosce a fondo la gestione della memoria del sistema operativo e potrebbe aiutarmi a capire cosa sta succedendo. Ho conosciuto il problema della perdita di memoria di Lollipop e anche la perdita di Webview, ma AFAIK questi non si applicano a Kitkats con visualizzazioni Web aggiornate. –

+0

Le attività possono anche essere avviate nei propri processi http://developer.android.com/guide/topics/manifest/activity-element.html#proc – nandeesh

+1

Se si utilizza la telecamera tramite Intent, si utilizza già la fotocamera in un processo separato. L'app fotocamera che viene lanciata può essere scelta dall'utente, e potrebbe essere enorme, spingendo il tuo processo fuori dalla memoria. La tua app dovrebbe essere preparata a essere un buon cittadino nel sistema Android, mantenendo lo stato in uscita e ripristinandolo quando viene restituito il risultato Intent. Ma se questa distruzione non è accettabile per il tuo caso d'uso, devi implementare una "telecamera personalizzata" all'interno della tua app. L'utilizzo di una telecamera di questo tipo non è un'attività che richiede molta memoria. –

risposta

2

Il comportamento descritto è totalmente d'accordo con la documentazione Application fundamentals da cui è chiaro che "aprire la fotocamera in un processo diverso" non ti aiuta, proprio perché questo è ciò che accade già per impostazione predefinita:

Quando il sistema avvia un componente, avvia il processo per quell'app (se non è già in esecuzione) e crea un'istanza delle classi necessarie per il componente. Ad esempio, se la tua app avvia l'attività nell'app Fotocamera che cattura una foto, quell'attività viene eseguita nel processo che appartiene all'app della fotocamera, non nel processo della tua app.

Così, quando l'applicazione fotocamera è portato a primo piano, la vostra applicazione va a fondo, che lo fa essere uno dei candidati ad essere ucciso dal sistema quando è basso sulla memoria come per Processes and Application Life Cycle. Stai assistendo a un normale comportamento del sistema operativo. La quantità totale di RAM non è un punto chiave. Memoria gratuita dell'importo disponibile per il processo in questione.

Con ciò detto, la risposta alla tua domanda è No. Qualsiasi Activity viene avviato ed eseguito all'interno dell'applicazione (processo) in cui è stato originariamente dichiarato tramite il file manifest, indipendentemente dal processo da cui proviene la richiesta di avvio.

Il comando

adb shell ps | grep 'app_name' 

vi dirà che elabora la vostra e la fotocamera app sono in esecuzione su.

Due applicazioni possono funzionare nello stesso processo, però, ma il presupposto necessario per questo è la stessa firma delle applicazioni ... Da Application fundamentals:

E 'possibile organizzare per due applicazioni di condividere lo stesso ID utente Linux ... Le app con lo stesso ID utente possono anche organizzarsi per essere eseguite nello stesso processo Linux e condividere la stessa VM (anche le app devono essere firmate con lo stesso certificato).

+0

In base a [questa guida per sviluppatori] (http://developer.android.com/guide/components/processes-and-threads.html#Processes) è possibile utilizzare anche "android: process' per le attività. –

+0

corretto. Sebbene tu possa utilizzare l'attributo all'interno delle tue app, non puoi modificarlo per un'app per fotocamere, quindi indipendentemente dal valore di "processo" impostato, l'attività della fotocamera "Attività" verrà eseguita in un processo diverso (con il nome predefinito se l'attributo non è stato impostato nel manifest). – Onik

+0

Capisco. Forse è utile per le attività interne della fotocamera basate su SurfaceHolder. –

Problemi correlati