Ehhh tyle razy o tym pisałem.
W związku z tym, że systemy mobilne w pewien sposób różnią się od systemów, które znajdują się na desktopach pewne rzeczy trzeba było stworzyć inaczej - min. multitasking. Telefony nie posiadają obszaru gdzie mogą zrzucić część pamięci ram - tzw. SWAP. Oczywiście można sobie to "dorobić", jednak objawia się to lagami - próbowałem różnych konfiguracji i zawsze były drobne lagi.
Multitasking w Androidzie jest inteligentny. Źle skonfigurowany przez producenta, lub użytkownika może prowadzić do tego, że urządzenie będzie pracowało zupełnie inaczej niż ktoś sobie to przyjął.
Android wykorzystuje standardową funkcjonalność jądra Linuksa OOM - OutOfMemory. W momencie kiedy w systemie poziom pamięci RAM zbliża się do wartości krytycznej, lub zero - w zależności od konfiguracji -
/sys/module/lowmemorykiller/parameters/minfree zostaje zabita aplikacja, aby pamięć zwolnić.
Sztuką jest tutaj wybrać jaką aplikację system ma zamknąć.
ActivityManagerServer.java:
Cytat:
FOREGROUND_APP:
// This is the process running the current foreground app. We'd really
// rather not kill it! Value set in system/rootdir/init.rc on startup.
VISIBLE_APP:
// This is a process only hosting activities that are visible to the
// user, so we'd prefer they don't disappear. Value set in
// system/rootdir/init.rc on startup.
SECONDARY_SERVER:
// This is a process holding a secondary server -- killing it will not
// have much of an impact as far as the user is concerned. Value set in
// system/rootdir/init.rc on startup.
HIDDEN_APP:
// This is a process only hosting activities that are not visible,
// so it can be killed without any disruption. Value set in
// system/rootdir/init.rc on startup.
CONTENT_PROVIDER:
// This is a process with a content provider that does not have any clients
// attached to it. If it did have any clients, its adjustment would be the
// one for the highest-priority of those processes.
EMPTY_APP:
// This is a process without anything currently running in it. Definitely
// the first to go! Value set in system/rootdir/init.rc on startup.
// This value is initalized in the constructor, careful when refering to
// this static variable externally.
|
Jak widać aplikacje są dzielone na 6 grup. Każda z tych grup ma określony priorytet - wpływa to na to jaki typ aplikacji zostanie zabity najpierw. Jeżeli jest kilka aplikacji tego samego typu to system jakimś magicznym algorytmem oblicza którą ma z nich zabić najpierw. Pewnie sprawdza ostatni czas kiedy użytkownik coś na niej robił itp.
Plik minfree (1 strona == 4 KB pamięci) zawiera wartości dla tych 6 przedziałów. Regulując te wartości możemy np. zwiększyć ilość aplikacji, która będzie trzymana w pamięci.
Więcej można poczytać np. tutaj -
http://forum.xda-developers.com/showthread.php?t=622666
Należy także dodać, że aplikacje w systemie reagują na sygnały systemowe. Np. uruchomiono WiFi. Jeżeli obsłużymy taki sygnał, to możemy powiedzieć naszej aplikacji co ma robić - np. pobranie poczty. Jest to bardzo przydatna rzecz, bo można stworzyć bardzo potężne aplikacje. Jednak wykorzystane nieprawidłowo, lub nadużywane może objawiać się tym, że dana aplikacja będzie się uruchamiała przy większości sygnałów.