2012-12-04 13 views
9

Zajmuję się uruchomieniem aplikacji Android Launcher (wymiana ekranu głównego) i uruchomieniem programu uruchamiającego, który zostaje zabity w sytuacjach z małą ilością pamięci. Oczywiście nie jest to wspaniałe, gdy użytkownik wraca do domu i musi czekać.Priorytety regulacji OOM (brak pamięci) aplikacji dla procesów

W moich badań, znalazłem, że Android klasyfikuje procesy na kilka grup priorytetowych, od najwyższego do najniższego:

Systemu

Trwałych

Planie

Widoczne

Dostrzegalne

na usługi

domowe

Poprzednia

B Usługi

Tło

Można sprawdzić jakie procesy wchodzą w której wykonując: ADB shell dumpsys meminfo

Najobszerniejsza dokumentacja, którą mogłem znaleźć na ten temat: http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

Nie daje jednak jasnego obrazu wszystkich wymienionych powyżej grup. W szczególności,

  1. Jak/kiedy proces jest uważany za "dostrzegalny"? Niektóre aplikacje (takie jak Go Launcher EX) wydają się znajdować w tej kategorii, gdy nie są na pierwszym planie. W ten sposób nie ginie tak często. Jak oni to robią?

    Znajduję od działania adb shell dumpsys, że Go Launcher Ex jest uważany za usługę pierwszego planu. Jedyną dostępną dokumentacją na ten temat jest to, że musisz umieścić trwałe powiadomienie na pasku stanu. Jednak Go Launcher Ex jakoś ominął ten wymóg. Gubię, jak: - (

  2. Jaka jest różnica między „A Services”, „Dom” i „B Services”

  3. Wszelkie inne ogólne porady dla aplikacji wyrzutni w jaki sposób? mogą zyskać wyższy priorytet niż zwykły aplikacji? Myślę, że jest to całkowicie uzasadnione żądanie zważywszy, że wyrzutnia powinny uznać wyższy priorytet niż większość rzeczy (z wyjątkiem bieżącej działalności planie) dla użytkowników.

+0

Ładne pytanie! Dodaj 1 dla dumpsys. – herbertD

Odpowiedz

10

odpowiedzieć na pytanie 1) i 3)
Jeśli widzisz logcat -b events możesz zobaczyć te aplikacje z priorytetem rzeczywiście wyczuwalne, aby utworzyć powiadomienie. Ale wszystkie właściwości (nawet contentView) ustawione na wartość null.
Więc na moje badania na ten sam problem po prostu starał się utworzyć pusty powiadomienie i rozpocząć moją usługę z nim:

startForeground(42, new Notification())

i voilà: logcat mówi:

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

i dumpsys meminfo:

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

Nie sądzę, że jest to zamierzone i należy rozumieć, że powinno to być tylko być użyty, jeśli naprawdę jest to wymagane. Nie chcę wyobrazić sobie każdej marnej usługi z tego powodu.

+2

Dzięki za odpowiedź! Właśnie potwierdziłem wszystko i to jest całkiem niesamowite ... Chciałbym teraz ukryć tę odpowiedź w obawie, że każda kiepska aplikacja może spróbować tego użyć i całkowicie obejść zarządzanie pamięcią Androida :-) – dubchoi

+0

używałem startForeground (0, powiadom) i za pomocą startForeground (1, notify) pracował dla mnie, dzięki za pomysł na dowiedzieć się, co było nie tak w kodzie. Nigdy nie myślałem, że ustawienie identyfikatora powiadomienia na 1 lub 42 zmieni tak wiele rzeczy – Diljeet

0

Według doc, do którego się odwołujesz, Możesz spróbować uruchomić usługę długoterminową za pomocą wyższy priorytet w Launcherze i sprawdzić wydajność razy KILL.

Powiązane problemy