Ответ
Activity на главном экране (например, MainActivity) не уничтожается GC, потому что на неё есть сильные ссылки из системы Android.
Ключевые причины:
- Activity хранится в стеке задач (back stack)
- На неё ссылается WindowManager через DecorView
- Жизненный цикл управляется системой, а не GC
Пример:
class MainActivity : AppCompatActivity() {
// Активность удерживается системой пока видима
override fun onCreate() {
super.onCreate()
setContentView(R.layout.activity_main)
}
}
GC может собрать только Activity, на которую больше нет ссылок (например, после finish() и удаления из стека). Главная Activity всегда имеет активные ссылки, пока приложение запущено.
Ответ 18+ 🔞
А, ну это классика, блядь! Сейчас объясню на пальцах, почему твоя главная активити не сдыхает как последняя собака, когда ты по приложению шаришься.
Смотри, ёпта. Представь, что твоя MainActivity — это как будто ты сам, сидишь на своём любимом диване. Пока ты на этом диване сидишь, тебя же мусорщики (наш GC) не вынесут на помойку? Вот и система Android — она не дура, она тебя за жопу держит, пока ты ей нужен.
Почему так происходит, ёб твою мать:
-
Стек задач (Back Stack). Это как очередь в столовую, только для экранов. Твоя главная активити — это первый в очереди, его всегда видно. Пока он в этой очереди, система за него цепляется мёртвой хваткой. Это ж её внутренняя кухня, она не отпустит просто так.
-
WindowManager и его приблуды. Система рисует твоё окно через
DecorView. Получается, на твою активити смотрит какой-то системныйWindowManagerи думает: "А, окно живое, надо держать". И держит. Пока окно висит, ссылка на активити есть. Доверия ебать ноль к тому, что она её отпустит. -
Жизненный цикл — это царь и бог. Тут не ты решаешь, когда активити помирать. Тут система командует парадом. Она говорит "onPause" — ты замираешь. Говорит "onDestroy" — только тогда начинается разговор о сборке мусора. А до этого — сиди и не рыпайся, терпения ноль ебать.
Вот смотри на этот кусок кода, тут всё честно:
class MainActivity : AppCompatActivity() {
// Активность удерживается системой пока видима
override fun onCreate() {
super.onCreate()
setContentView(R.layout.activity_main)
}
}
Пока этот экран торчит у пользователя перед глазами, система за него отвечает. Это её ребёнок, она его не бросит.
А когда же её наконец-то съест GC?
А вот тогда, когда на неё вообще нихуя не будет ссылаться. То есть ты вызвал finish(), система выпихнула её из стека задач, все вьюхи отцепила, и все остальные объекты про неё забыли. Вот тогда, сам от себя охуев, сборщик мусора подскочит и скажет: "А, свободная память! Пошла нахуй!". И очистит.
Но главная-то активити, пока приложение живо, почти всегда кому-то нужна. Так что да похуй на беспокойство — она под надёжным колпаком. Прямо как хитрая жопа, которая всегда выкрутится.