Hot Start — стартиране на мобилно приложение от минимизирано състояние, когато процесът вече е в паметта. За разлика от Cold Start, при който системата създава процес от нулата, горещият старт отнема от 200 до 500 ms и се ограничава до извикване на onCreate и onStart в Activity. Според Android Developers, 2025, Hot Start е най-бързият сценарий, но скоростта му зависи пряко от обема работа в lifecycle методите.
Основни точки
Hot Start — сценарий за стартиране на приложение, при който неговият процес вече съществува в RAM паметта на устройството. Потребителят минимизира приложението, след това се връща — и системата не създава нов процес, а възобновява съществуващ. В този сценарий не се изисква зареждане на OS, инициализация на класа Application и създаване на процес, което драстично намалява времето до появата на UI на екрана. Според Android Documentation (2025), Hot Start отнема само 200–500 ms, докато Cold Start може да достигне 5 секунди или повече. Разликата в скоростта е особено забележима на устройства с ограничена памет, където системата по-често разтоварва фоновите приложения.
Основната характеристика на Hot Start — минимален набор от извиквани lifecycle методи. В Android това са Activity.onCreate и Activity.onStart, в iOS — applicationDidBecomeActive. За разлика от Cold Start, където последователно се извикват Application.onCreate, ContentProvider.onCreate, Activity.onCreate и множество инициализации на библиотеки, Hot Start пропуска всички тези етапи. Разработчикът трябва да разбира кой код се изпълнява точно при горещо стартиране — често тежките инициализации на SDK, аналитика и DI контейнери се повтарят и на Cold, и на Hot Start, въпреки че при горещ старт вече не са необходими.
Трите сценария за стартиране на приложение се различават по дълбочина на инициализация. Cold Start (студен старт) се случва, когато приложението се стартира за първи път след инсталация, рестартиране на устройството или разтоварване от паметта. Системата създава нов Linux процес, зарежда класовете Application, създава инстанции на ContentProvider, извършва инициализация на библиотеки и едва тогава показва Activity. Целият процес отнема 2–10 секунди в зависимост от сложността на приложението и характеристиките на устройството.
Warm Start (топъл старт) — междинен сценарий. Процесът на приложението е жив в паметта, но Activity е унищожено и трябва да бъде създадено отново. Това се случва, например, при завъртане на екрана или при връщане от друго приложение, когато Activity е разтоварено поради липса на памет, но процесът е останал. Warm Start включва извикване на Activity.onCreate и Activity.onStart, но не включва Application.onCreate и инициализация на ContentProvider. Времето на Warm Start — от 500 ms до 2 секунди. Hot Start — най-бързият от трите: Activity вече съществува в back stack, процесът е жив и системата просто извиква Activity.onRestart, onStart и onResume. Времето на Hot Start — 200–500 ms. Разликата от Warm Start е, че Activity не се създава наново — то се възстановява от съществуваща инстанция.
| Параметър | Cold Start | Warm Start | Hot Start |
|---|---|---|---|
| Процес | Създава се наново | Съществува | Съществува |
| Activity | Създава се наново | Създава се наново | Възстановява се |
| Application.onCreate | Извиква се | Не се извиква | Не се извиква |
| Типично време | 2–10 с | 0.5–2 с | 0.2–0.5 с |
| Lifecycle методи | Всички | onCreate + onStart | onRestart + onStart |
В Android Hot Start се инициира, когато потребителят се връща в приложението чрез Recents екрана или чрез кликване на иконата в минимизирано състояние. Системата проверява дали процесът е жив, и ако да — последователно извиква Activity.onRestart, onStart и onResume. Методът onCreate не се извиква при Hot Start, тъй като инстанцията на Activity вече съществува в паметта. Това е важна разлика от Warm Start, където onCreate все пак се извиква поради унищожаването на Activity. Според Google I/O 2019, типичното време на Hot Start в Android е 200–400 ms и всяко забавяне на този етап пряко увеличава perceived launch time.
Разработчиците често не забелязват, че кодът за инициализация на UI, абонамент за LiveData или настройка на RecyclerView се изпълнява не само в onCreate, но и в onStart или onResume. При Hot Start тези кодови блокове се изпълняват отново, въпреки че UI вече е настроен. Препоръчва се разделяне на еднократната инициализация (в onCreate с проверка на savedInstanceState) и възобновяемата логика (onStart/onResume). Например, тежките операции — настройка на адаптери, зареждане на списъци — е по-добре да се преместят в блок, който не се изпълнява при onRestart, или да се проверява savedInstanceState.
Следният код в Kotlin демонстрира прост начин за определяне на сценария на старт и измерване на времето. Променливата launchTimeStamp записва момента на началото на стартирането, а isColdStart позволява разделяне на логиката за студено и горещо стартиране.
class MainActivity : AppCompatActivity() {
private var launchTimeStamp = 0L
private var isColdStart = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
isColdStart = true
launchTimeStamp = System.currentTimeMillis()
// еднократна инициализация
} else {
isColdStart = false
// Hot Start — Activity се възстановява
}
}
override fun onResume() {
super.onResume()
if (isColdStart) {
val launchTime =
System.currentTimeMillis() - launchTimeStamp
Log.d("LaunchTime", "Cold Start: $launchTime ms")
}
}
}
В iOS Hot Start съответства на връщането на приложението от фона чрез sceneDidBecomeActive (UIKit) или onAppear (SwiftUI). Операционната система не създава отново процеса, ако приложението е било в състояние Suspended или Background. При горещо стартиране се извиква applicationDidBecomeActive в AppDelegate, но не се извиква applicationDidFinishLaunching — това е аналог на Android, където Application.onCreate се пропуска. iOS по-агресивно разтоварва приложенията от паметта: ако устройството няма достатъчно RAM, системата може да разтовари фоновото приложение и следващото стартиране ще бъде Cold Start. Според Apple Developer Documentation, средното време на Hot Start в iOS е 300–600 ms.
Ключовата разлика на iOS — липсата на пряк аналог на Warm Start в разбирането на Android. В iOS при минимизиране на приложението се извиква sceneDidEnterBackground, а при връщане — sceneWillEnterForeground и sceneDidBecomeActive. Ако системата разтовари сцената, но остави процеса жив, следващото стартиране ще бъде Cold от гледна точка на сцената, но Hot от гледна точка на процеса. Разработчикът трябва да вземе това предвид при поставянето на инициализационен код: абонамент за NotificationCenter, актуализация на UI и нулиране на състояния трябва да бъдат точно в sceneDidBecomeActive, а не само в viewDidLoad.
Този код в Swift показва как да проследявате броя на горещите стартирания и да разделяте логиката. Броячът foregroundCount се увеличава при всяко връщане от фона.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var foregroundCount = 0
func sceneDidBecomeActive(
_ scene: UIScene
) {
foregroundCount += 1
if foregroundCount == 1 {
// Cold Start — пълна инициализация
setupSDKs()
} else {
// Hot Start — само обновяване на UI
refreshUI()
}
}
private func refreshUI() {
// обновяване на данните на екрана
}
}
Върху скоростта на Hot Start влияят няколко категории фактори. Първата — обемът работа в lifecycle методите onStart и onResume. Ако разработчикът е поставил в тези методи зареждане на данни от мрежата, парсване на JSON, инициализация на адаптери или тежки изчисления, всеки такъв блок добавя десетки и стотици милисекунди към времето за стартиране. Според данните от инструмента Android Vitals, приложенията с продължителност на Hot Start над 800 ms губят до 20% от потребителите при повторно връщане.
Втората категория — фрагменти и View, възстановявани от savedInstanceState. Ако фрагментите съдържат тежки ViewPager2, WebView или сложни йерархии с дълбоко влагане, тяхното възстановяване изразходва CPU ресурси. Според Google I/O 2023, всеки вложен ViewGroup добавя средно 2–5 ms към времето за рендериране при Hot Start. Третата категория — SDK на трети страни: библиотеки за аналитика, crash-reporting, A/B-тестване и DEX зареждачи могат да извършват инициализация при всяко връщане от фона. Препоръчва се да проверите кои SDK изпълняват код точно в onStart/onResume и да отлагате некритичните задачи на фонова нишка.
Оптимизацията на Hot Start се свежда до минимизиране на работата в lifecycle методите за възобновяване. Първият метод — мързелива инициализация: целият код, който не е необходим за първия кадър на UI, трябва да се изпълнява след извикване на onResume със закъснение чрез Handler.postDelayed или Coroutine.launch(Dispatchers.IO). Вторият метод — кеширане на състоянието на View: при минимизиране на приложението запазвайте данните в кеш в паметта, за да не ги зареждате отново от базата данни или мрежата при Hot Start. Третият метод — използване на SavedStateHandle в Android и StateRestorationPolicy в iOS за минимизиране на обема на възстановяваните данни.
В този пример Handler.postDelayed отлага инициализацията на аналитиката с 500 ms след рендерирането на първия кадър. Това не влияе на perceived launch time, тъй като потребителят вече вижда интерфейса.
class AnalyticsDeferrer {
fun lazyInitAfterHotStart() {
val handler = Handler(Looper.getMainLooper())
handler.postDelayed({
// инициализация след първия кадър
Analytics.init(Application.getInstance())
CrashReporter.start()
}, 500)
}
}
AndroidX App Startup позволява управление на реда за инициализация на компоненти при стартиране. Всички ContentProvider се инициализират автоматично при Cold Start, но можете да изключите автоматичната инициализация за компоненти, които не са необходими при Hot Start.
@Initializer(Application::class)
class SdkInitializer : Initializer<Unit> {
override fun create(context: Context) {
SdkOne.init(context)
SdkTwo.init(context)
}
override fun dependencies() = emptyList<Class<*>>()
}
За измерване на времето на Hot Start съществуват както вградени инструменти на платформите, така и решения на трети страни. В Android ключовият инструмент е Android Vitals в Google Play Console — той автоматично събира метрики за времето за стартиране за всички сценарии (Cold, Warm, Hot) с разбивка по модели устройства и версии на OS. Допълнително може да се използва Macrobenchmark от AndroidX — библиотека за автоматизирано тестване на производителността на стартиране. В iOS еквивалентът е MetricKit, който събира данни за времето за стартиране, честотата на кадрите и използването на памет.
За детайлно профилиране на горещото стартиране са подходящи Firebase Performance Monitoring (проследява custom traces) и New Relic с табла за времето за стартиране. От страна на разработчика за ръчно измерване се използва reportFullyDrawn в Android — API, който уведомява системата за точния момент, когато UI е рендериран и готов за взаимодействие. В iOS еквивалентът е endActivity в MetricKit. Комбинирайки тези инструменти, можете да идентифицирате кое SDK или кодов блок забавя Hot Start точно на конкретни устройства.
Код в Kotlin с използване на библиотеката Macrobenchmark за измерване на Cold и Hot Start. Тестът стартира Activity и измерва времето до състояние complete.
@RunWith(AndroidJUnit4::class)
class StartupBenchmark {
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun hotStart() {
benchmarkRule.measureRepeated(
packageName = "com.example.app",
metrics = listOf(StartupTimingMetric()),
iterations = 10,
startupMode = StartupMode.HOT
) {
pressHome()
startActivityAndWait()
}
}
}
Често задавани въпроси
Cold Start създава процес от нулата — зарежда Application, ContentProvider, изпълнява всички lifecycle методи. Hot Start използва вече съществуващ процес и не изисква повторно създаване на Activity, което го прави 5–10 пъти по-бърз.
При Hot Start в Android се извикват Activity.onRestart, след това onStart и onResume. Методът onCreate не се извиква, тъй като инстанцията на Activity вече съществува в паметта и не е унищожена.
Основните причини — тежка инициализация в onStart и onResume, зареждане на данни от мрежата, възстановяване на сложни View йерархии и изпълнение на код на SDK на трети страни при всяко връщане от фона.
В Android използвайте Macrobenchmark с StartupMode.HOT, в iOS — MetricKit. За производствен мониторинг са подходящи Firebase Performance и Android Vitals в Google Play Console.
Не, Hot Start и Warm Start — различни сценарии, определяни от системата. Hot Start се случва, когато Activity е живо, Warm — когато Activity е унищожено, но процесът е жив. Разработчикът не може принудително да промени сценария.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също