Привіт, мені цікаво, як Android керує пам'яттю, і я не можу ніде знайти точну відповідь. Припустимо, у мене є додаток із 5 видами діяльності на поточному стеку активності (4 зупинено і 1 відновлено), сервіс не підключений. Я натискаю кнопку ДОМАШНИЙ, щоб всі мої дії були припинені. Я запускаю деякі інші програми, що споживають пам'ять, і загальна пам’ять пристрою починає бути низькою. І питання в цьому
... Що буде з моєю заявою?
- Чи може система знищити лише одну чи деякі мої дії для відновлення пам'яті?
- Чи знищить систему весь процес моєї заявки? Чи всі дії будуть добре знищені?
- Що буде, коли я повернуся до своєї заяви, коли вона була повністю вбита? Почнеться з початківців (як перший старт) чи спробує відновити діяльність до попереднього стану / якщо так - це лише той, що знаходиться на вершині стека, або всі вони?
ОНОВЛЕННЯ:
Перш ніж задавати це питання, я кілька разів бачив життєвий цикл діяльності, але він не відповідає на мої запитання. Я зробив кілька тестів, і у мене є відповіді. "Стоп процес" в DDMS був підказкою для тестування.
Я не перевіряв відповідь на запитання 1, але, як говорить керівництво:
Якщо діяльність призупинена або зупинена, система може скинути активність із пам'яті, попросивши її закінчити, або просто знищивши процес.
Здається, що одну або кілька заходів можна обережно знищити (методом onDestroy), не вбиваючи процес. Ви просто отримаєте (onCreate + пакет), коли повернетесь до них.
Відповідь на питання 2:
ТАК. Зазвичай система вбиває весь процес, це означає, що всі дані, включаючи діяльність та статичні поля, знищуються. Це НЕ робиться красиво - ви не отримаєте onDestroy або штрафуєте () за будь-яку з призупинених / зупинених дій. Ось чому saveInstanceState () викликається безпосередньо перед методом onPause. onPause - це в основному останній метод, де вам слід щось зберегти, оскільки після цього методу ви ніколи не могли бачити onStop або onDestroy. Система може просто знищити процес знищення всіх ваших об'єктів, що б вони не мали, і що б вони не робили.
Відповідь на питання 3:
Що станеться, коли ви повернетесь до вбитої програми?
- До Android 2.2 - додаток почнеться з початківців, починаючи з запуску.
- Починаючи з 2.2 - система відновить попередній стан програми. Що це означає? Це означає, що остання видима активність буде відтворена (onCreate + bundle). Що буде з стеком активності? Стек чудово, але всі дії на ньому мертві. Кожен з них буде відтворений (onCreate + пакет), коли ви повернетесь до нього за допомогою кнопки "назад". Є ще одне в цьому:
Зазвичай система очищає завдання (видаляє всі дії зі стека над кореневою активністю) у певних ситуаціях, коли користувач повторно вибирає це завдання з головного екрану. Як правило, це робиться, якщо користувач не відвідував завдання протягом певного часу, наприклад 30 хвилин.
Висновок?
- Не думайте, що проблеми з обертанням операцій обертання можна вирішити за допомогою android: configChanges = "орієнтація". Коли ви це зробите, у вас виникне багато інших проблем, про які ви навіть не знаєте.
- Перевірте свою програму за допомогою DDMS - кнопка "Зупинити процес". Дивіться це
- Будьте уважні при використанні статичних змінних. Не думайте, що коли ви ініціалізуєте їх у діяльності 1 - ви будете їх ініціалізувати у діяльності 2. Єдиним безпечним місцем для ініціалізації глобальної статики буде клас додатків.
- Пам'ятайте, що ви ніколи не бачите onStop або onDestroy. Закрийте файли / бази, зупиніть завантажувачі в програмі Pauuse. Якщо ви хочете, щоб програма щось робила в БГ - використовуйте сервіс переднього плану.
Це було б ... Сподіваюся, я допоміг зі своєю ессі :)