Ответ
ActivityThread содержит Looper в основном потоке (UI-потоке), который постоянно обрабатывает сообщения из MessageQueue. Это бесконечный цикл (Looper.loop()), который ждет новые задачи (например, обновление UI, обработку кликов и т.д.).
Пока есть сообщения в очереди и Lopper не остановлен (quit()), приложение продолжает работать.
Пример кода:
// Внутри ActivityThread.main()
Looper.prepareMainLooper()
Looper.loop() // Бесконечный цикл
Если Looper завершится (например, при падении главного потока), приложение упадет с ANR.