2012-12-04 6 views
9

Sto sviluppando un'applicazione Android Launcher (sostituzione schermata iniziale) e l'esecuzione nel programma di avvio che viene ucciso in situazioni di memoria insufficiente. Questo ovviamente non è eccezionale quando l'utente torna a casa e deve aspettare.Priorità di regolazione OOM (Memoria esaurita) delle app Android per i processi

Nella mia ricerca, ho trovato che Android classifica i processi in diversi gruppi di priorità, dal più alto al più basso:

sistema

persistente

Primo piano

Visibile

Perceptible

Una Servizi

casa

Precedente

B Servizi

Sfondo

È possibile esaminare quali processi caduta sotto il quale eseguendo: dumpsys adb shell MemInfo

Il più completo la documentazione che ho trovato su questo argomento era: http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

Tuttavia, non fornisce un'immagine chiara di tutti i gruppi menzionati sopra. In particolare,

  1. Come/quando un processo è considerato "percettibile"? Alcune app (come lo Go Launcher EX) sembrano aver capito come rimanere in questa categoria quando non sono in primo piano. In questo modo, non viene ucciso più spesso. Come stanno facendo?

    Trovo dall'attività dbbsh della shell adb che Go Launcher Ex è considerato un servizio in primo piano. L'unica documentazione che posso trovare su questo argomento dice che è necessario inserire una notifica persistente nella barra di stato. Tuttavia, Go Launcher Ex ha in qualche modo aggirato questo requisito. Mi sono perso su come: - (

  2. Qual è la differenza tra "A Servizi", "casa", e "B Servizi"

  3. Qualsiasi altro consiglio generale per un'applicazione di avvio su come? può guadagnare priorità maggiore rispetto un'applicazione regolare? Penso che questa sia una richiesta del tutto legittima, dato che un lanciatore dovrebbe essere considerata una priorità maggiore rispetto maggior parte delle cose (tranne l'attività corrente in primo piano) per gli utenti.

+0

Bella domanda! Aggiungi 1 per dumpsys. – herbertD

risposta

10

per rispondere alla domanda 1) e 3)
se si dispone di logcat -b events è possibile vedere quelle applicazioni con priorità percepibile effettivamente creare una notifica. Ma tutte le proprietà (anche contentView) sono impostate su null.
Così sulla mia ricerca per lo stesso problema che ho appena cercato di creare una notifica vuota e iniziare il mio servizio con esso:

startForeground(42, new Notification())

e voilà: logcat dice:

I/notification_enqueue(1607): [my.testapp.TestApp,42,NULL,Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 kind=[null])] 

e dumpsys meminfo:

... 
17539 kB: Perceptible 
    ... 
    6164 kB: my.testapp.TestApp (pid 25573) 
... 

Non penso che questo sia previsto, e dovrebbe essere inteso che questo dovrebbe solo essere usato se davvero richiesto. Non voglio immaginare ogni schifoso servizio usando questo.

+2

Grazie per la risposta! Ho appena confermato tutto e questo è abbastanza sorprendente ... Voglio quasi nascondere questa risposta adesso nel timore che ogni app scadente possa provare a utilizzare questa funzione e ignorare completamente la gestione della memoria di Android :-) – dubchoi

+0

stavo usando startForeground (0, notify) e l'utilizzo di startForeground (1, notify) ha funzionato per me, grazie per l'idea di capire cosa c'era di sbagliato nel codice. Non ho mai pensato che impostare l'id di notifica su 1 o 42 cambierà così tante cose – Diljeet

0

Secondo il documento a cui hai fatto riferimento, puoi provare a avviare un servizio a lungo termine con priorità più alta in Launcher e controllare le prestazioni in termini di KILL.

Problemi correlati