OnCreate вызывается когда активити создается. В onCreate вы должны вызвать метод setContentView onStart


Download 129.24 Kb.
bet2/3
Sana24.03.2023
Hajmi129.24 Kb.
#1290885
1   2   3
Bog'liq
Мобил иловалар мустакил иш

onSaveInstanceState() вызывается после onStop() на версии API ≥ 28. На API < 28 этот коллбэк вызывается перед onStop() и нет гарантий до или после onPause().

onRestoreInstanceState() вызывается после onStart().
Activity Context создается при создании активити и уничтожается вместе с активити. Контекст – тяжелый объект. Когда говорят об утечке памяти в андроиде, имеют в виду утечку контекста, т.е. ситуацию, когда контекст активити хранится после вызова Activity.onDestroy(). Не передавайте контекст активити в другой объект, если не известно как долго этот объект проживет. Подробнее о memory leak.

Application Context – синглтон. Application Context создается при создании объекта Application и живет, пока жив процесс приложения. По этой причине Application Context можно безопасно инжектить в другие синглтоны в приложении. Не рекомендуется использовать Application Context для старта активити, потому что необходимо создание новой задачи, и для layout inflation, потому что используется дефолтная тема.
Утечка активити и контекста в сущности одно и то же, т.к. класс Activity – наследник класса Context. Когда говорят об утечке активити или контекста, имеют в виду memory leak. Memory leak в Java – это ситуация, когда объект больше не используется, но сборщик мусора не может удалить объект из памяти, потому что на него ссылаются другие объекты.

Об утечке активити говорят, когда у активити вызван метод onDestroy(), но на активити все еще есть внешние ссылки. Например сохранение Activity Context в статическую переменную приводит к утечке.

Activity – тяжелый объект, занимающий относительно много места в памяти, поэтому утечка объектов Activity – большая проблема для Android приложения. Частые утечки активити могут привести к OutOfMemoryError и крэшу приложения.
Leakcanary – библиотека, которая помогает отслеживать утечки памяти в Android приложении.
Поведение неопределенно и зависит от реализации приложения-лаунчера, установленного на устройстве пользователя.
В лучшем случае иконка приложения останется в меню приложений и на рабочем столе и для пользователя все пройдет без изменений.
В худшем – на рабочем столе останется иконка приложения при нажатии на которую лаунчер будет пытаться запустить активити по старому имени. С точки зрения пользователя это выглядит будто приложение перестало работать и может привести к удалению приложения.
Следует помнить об этом сайд эффекте при рефакторинге приложения.
Под main activity понимается активити, у которой intent-filter содержит ACTION_MAIN и CATEGORY_LAUNCHER.

В AndroidManifest можно добавить несколько main activity. Для каждой активити появится иконка в меню приложений. По-умолчанию будет использоваться иконка и имя приложения, заданные в атрибутах icon и label элемента application в манифесте. Эти атрибуты можно переопределить в элементе activity.

Этот механизм может быть полезен для библиотек, которые используются в debug/testing билдах. Так библиотека leakcanary добавляет иконку для запуска своей активити из меню приложений.
Синхронно.

Этот вопрос аналогичен вопросу о Handler.post()Handler.post() выполняется асинхронно и для синхронного выполнения предлагается проверять текущий поток. В runOnUiThread() есть эта проверка.


Если текущий поток – это UI тред, то параметр-runnable запускается сразу. Иначе выполнение делегируется в mHandler.post(), где mHandler – это хэндлер, созданный на UI потоке.

В Android 10 добавлена поддержка foldables и девайсов с большим экраном. В связи с этим было изменено поведение коллбэков onResume() и onPause() в режиме multi-window.

В Android 9 только активити, с которой взаимодействует пользователь, находилась в состоянии resumed, а все остальные активити на экране имели состояние paused.

Начиная с Android 10, все видимые активити в режиме multi-window находятся в состоянии resumed. Это поведение называется multi-resume.

Активити, с которой взаимодействует пользователь, называется topmost resumed.


Для того, чтобы различать resumed и topmost resumed активити, в Android 10 добавлен коллбэк onTopResumedActivityChanged(isTopResumed: Boolean). Этот метод вызывается, когда активити получает или теряет состояние topmost.

В Android 10 введены ограничения на старт активити из бэкграунда. Эти ограничения уменьшают случаи прерывания UX без активного действия со стороны пользователя.

Вместо старта активити из бэкграунда предлагается использовать нотификации. Этот способ взаимодействия дает пользователю больше контроля над тем, какие приложения и когда запускаются.

В случае со стартом активити приложение с foreground-сервисом рассматривается как работающее в бэкграунде. Чтобы приложение считалось запущенным в foreground, оно должно иметь активити в состоянии started. Помимо этого правила, существует ряд исключений.
Для старта стека из нескольких активити используется класс TaskStackBuilder.

После вызова метода startActivities() (см. картинку), стартует только activity3. Информация об activity1 и activity2 хранится в стеке. Когда пользователь нажимает «назад», или на activity3 вызывается метод finish(), создается и стартует activity2.

Этот механизм полезен для реализации роутинга при запуске приложения через deep link.



Download 129.24 Kb.

Do'stlaringiz bilan baham:
1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling