- Остановка и перезапуск Activity
- В этом уроке
- Вы также должны прочитать
- Попробуйте
- Остановка вашей activity
- Как перезапустить Android-активность
- Перезагрузить активность в Android
- 14 ответов
- Памятка по жизненному циклу Android — часть I. Отдельные Activity
- Часть 1: Activity
- Одно Aсtivity — Сценарий 1. Приложение завершено и перезапущено
- Одно Aсtivity — Сценарий 2. Пользователь уходит
- Одно Aсtivity — Сценарий 3. Изменение кофигурации
- Одно Aсtivity — Сценарий 4. Приложение приостановлено системой
- Перезапуск приложения Android программно
- 6 ответов:
Остановка и перезапуск Activity
В этом уроке
Вы также должны прочитать
Попробуйте
Правильная остановка и перезапуск вашей activity является важным процессом жизненного цикла activity , который дает пользователям чувство, что ваше приложение всегда живое и не теряет их прогресс. Есть несколько ключевых сценариев, в которых ваша activity останавливается и перезапускается:
- Пользователь открывает окно Недавние приложения и переключается с вашего приложения на другое приложение. activity вашего приложения, находящаяся в это время на переднем плане, останавливается. Если пользователь возвращается в ваше приложении с помощью значка запуска главного экрана или окна Недавние приложения, activity перезагружается.
- Пользователь выполняет действие в вашем приложении, которое начинается новую activity . Текущая activity будет остановлена, когда вторая activity будет создана. Если пользователь затем нажимает кнопку Назад , первая activity перезапустится.
- Пользователь получает телефонный звонок во время использования приложения на его или ее телефоне.
Activity класс предоставляет два метода жизненного цикла, onStop() и onRestart() , которые позволяют специально обрабатывать то, как ваша activity будет останавливаться и перезапускаться. В отличие от состояния приостановки, которое означает частичное перекрытие элементов пользовательского интерфейса, состояние остановки vгарантирует, что пользовательский интерфейс больше не виден и фокус пользователя находится в другой activity (или совершенно другом приложении).
Примечание: Поскольку система удерживает ваш Activity экземпляр в системной памяти, когда он остановлен, вполне возможно, что вам не нужно реализовывать onStop() и onRestart() (или даже onStart() методы вообще. Для большинства activity , которые относительно простые, activity будет остановлена и перезапущена вполне нормально, и вы, возможно, должны использовать только onPause() для приостановки текущих действий и отсоединения от системных ресурсов.
Рисунок 1. Когда пользователь покидает вашу activity , система вызывает onStop() для прекращения activity (1). Если пользователь возвращается по время остановки activity , система вызывает onRestart() (2), а затем быстро onStart() (3) и onResume() (4). Обратите внимание, что независимо от того, какой сценарий вызывает остановку activity , система всегда вызывает onPause() перед вызовом onStop() .
Остановка вашей activity
Когда ваша activity получает вызов onStop() метода, уже ничего не видно и вы должны освободить почти все ресурсы, которые не нужны, пока пользователь их не использует. После того, как ваша activity прекращается, система может уничтожить экземпляр, если это необходимо для восстановления системной памяти. В крайних случаях, система может просто убить ваш процесс приложения без вызова финального onDestroy() метода обратного вызова, поэтому очень важно использовать onStop() для освобождения ресурсов, которые могли бы привести к утечке памяти.
Несмотря на то, что onPause() метод вызывается до onStop() , вы должны использовать onStop() для выполнения более крупных и ресурсоемких операций завершения, таких как запись информации в базу данных.
Например, вот реализация onStop() , который сохраняет содержимое черновика записки в постоянное хранилище:
Источник
Как перезапустить Android-активность
Как перезапустить Android- Activity ? Я попробовал следующее, но Activity просто уходит.
Я сделал свой видеомикшер следующим образом:
В принципе, я сначала вызываю finish() , и я использую то же самое намерение, с которого была начата эта деятельность. Кажется, это трюк?
ОБНОВЛЕНИЕ: Как указано Ральфом ниже, Activity.recreate() – это путь в API 11 и далее. Это предпочтительнее, если вы находитесь в среде API11 +. Вы можете проверить текущую версию и вызывать фрагмент кода выше, если вы используете API 10 или ниже. (Пожалуйста, не забудьте оставить ответ Ральфа!)
Начиная с уровня API 11 (Honeycomb), вы можете вызвать метод recreate () активности (благодаря этому ответу).
Метод recreate () действует так же, как изменение конфигурации, поэтому также вызывают методы onSaveInstanceState () и onRestoreInstanceState (), если это применимо.
Перед SDK 11 способ сделать это выглядит так:
Просто чтобы совместить ответы Ральфа и Бена (включая изменения, сделанные в комментариях):
Это решение сработало для меня.
Сначала закончите операцию, а затем запустите ее снова.
Вызовите этот метод
Даже если на это ответили несколько раз.
Если перезапустить активность из фрагмента, я бы сделал так:
Значит, вы думаете, что это немного переборщило? Но проводка Handler позволяет вам вызвать это в методе жизненного цикла. Я использовал это в onRestart / onResume при проверке, изменилось ли состояние между пользователем, возвращающимся в приложение. (Что-то установил).
Без Handler если вы вызываете его в нечетном месте, он просто убьет действие и не перезапустит его.
Не стесняйтесь задавать любые вопросы.
Я использовал этот код, чтобы до сих пор поддерживать старые версии Android и использовать recreate() для новых версий Android.
Ну, это не список, а комбо некоторых, которые уже опубликованы:
Это самый простой способ перезапустить текущую деятельность:
На самом деле, следующий код действителен для уровней API 5 и выше, поэтому, если ваш целевой API ниже этого, вы получите нечто очень похожее на код EboMike.
Существует один хакерский подход, который должен работать над любой деятельностью, включая основную.
Когда изменения ориентации, Android обычно воссоздает вашу деятельность (если вы не переопределите ее). Этот метод полезен для поворотов на 180 градусов, когда Android не воссоздает вашу активность.
Попытайтесь использовать это ..
В сочетании со странным поведением SurfaceView LifeCycle с камерой . Я обнаружил, что recreate () не очень хорошо работает с жизненным циклом SurfaceViews. SurfaceDestroyed никогда не называется во время цикла отдыха. Он вызывается после onResume (странно), после чего мой SurfaceView уничтожается.
Исходный способ воссоздания деятельности отлично работает.
Я не могу точно понять, почему это так, но это просто наблюдение, которое, как мы надеемся, будет направлять других в будущем, поскольку оно устраняет мои проблемы с SurfaceViews
Если вы удалите последнюю строку, вы создадите новую act Activity, но ваш старый экземпляр останется в живых.
Вам нужно перезапустить Activity, как при изменении ориентации (т.е. ваше состояние сохраняется и передается в onCreate(Bundle) )?
Если вы этого не сделаете, одним из возможных способов решения проблемы будет использование одной дополнительной фиктивной операции, которая будет запущена из первого действия, и какая задача – запустить новый экземпляр. Или просто задерживайте вызов act.finish() после запуска нового.
Если вам нужно сохранить большую часть состояния, вы попадаете в довольно глубокие воды, потому что нетривиально передавать все свойства вашего состояния, особенно без утечки старого контекста / действия, передавая его новому экземпляру.
Пожалуйста, укажите, что вы пытаетесь сделать.
Решение по вашему вопросу:
Чтобы начать новую деятельность, необходимо включить в контекст активности, а также завершить текущую деятельность.
Надеюсь, это полезно .. и работает для меня.
Если вы вызываете какой-то фрагмент, то делайте ниже кода.
Вызовите метод onCreate. Например onCreate(null);
Источник
Перезагрузить активность в Android
это хорошая практика, чтобы перезагрузить Activity на Android?
что было бы лучшим способом сделать это? this.finish а то this.startActivity активность Intent ?
14 ответов
Вы можете просто использовать
обновление Activity изнутри.
это то, что я делаю, чтобы перезагрузить действие после изменения возврата из изменения предпочтений.
это по существу заставляет активность перерисовывать себя.
обновление: лучший способ сделать это-вызвать recreate() метод. Это приведет к воссозданию активности.
для тех, кто не хочет видеть, что мигает после recreate () метод просто использовать
Мне нужно было срочно обновить список сообщений в одном из моих приложений, поэтому я просто выполнил обновление моей основной активности пользовательского интерфейса, прежде чем закрыть диалоговое окно, в котором я был. Я уверен, что есть и лучшие способы добиться этого.
Android включает в себя систему управления процессами, которая обрабатывает создание и уничтожение деятельности, которая в значительной степени отрицает любую выгоду, которую вы увидите от ручного перезапуска деятельности. Вы можете посмотреть дополнительную информацию о нем по адресу Основы Применения
хорошая практика заключается в том, чтобы гарантировать, что ваши методы onPause и onStop освобождают любые ресурсы, которые вам не нужно удерживать и использовать onLowMemory уменьшить ваши потребности деятельностей до абсолютного минимума.
Источник
Памятка по жизненному циклу Android — часть I. Отдельные Activity
Android спроектирован так, чтобы использование приложения пользователем было максимально интуитивным. Например, пользователи приложения могут повернуть экран, ответить на уведомление или переключиться на другое приложение, и после этих манипуляций они все так же должны иметь возможность продолжить использовать приложение без каких-либо проблем.
Чтобы обеспечить такое взаимодействие с пользователем, вы должны знать, как управлять жизненными циклами компонентов. Компонентом может быть Activity, Fragment, Service, класс Application и даже сам процесс приложения. Компонент имеет жизненный цикл, в течение которого он проходит через различные состояния. Всякий раз, когда происходит переход, система уведомляет вас об этом при помощи методов жизненного цикла.
Чтобы нам было легче объяснить, как работает жизненный цикл в Android, мы определили несколько сценариев (примеров из жизни), которые сгруппированы по компонентам:
Часть 1: Activity — ЖЦ одного активити (этот пост)
Диаграммы также доступны в виде шпаргалки в формате PDF для краткого ознакомления.
Примечание: эти диаграммы соответствуют поведению в Android P/Jetpack 1.0.
Следующие сценарии демонстрируют поведение компонентов по умолчанию, если не указано иное.
Если вы обнаружили ошибки в статье или считаете, что не хватает чего-то важного, напишите об этом в комментариях.
Часть 1: Activity
Одно Aсtivity — Сценарий 1. Приложение завершено и перезапущено
Будет вызван, если:
Пользователь нажимает кнопку Назад или
Вызван метод Activity.finish()
Самый простой сценарий показывает, что происходит, когда приложение с одним активити запускается, завершается и перезапускается пользователем:
Управление состоянием
onSaveInstanceState не вызывается (поскольку активити завершено, вам не нужно сохранять состояние)
onCreate не имеет Bundle при повторном открытии приложения, потому что активити было завершено и состояние не нужно восстанавливать.
Одно Aсtivity — Сценарий 2. Пользователь уходит
Будет вызван, если:
Пользователь нажимает кнопку «Домой»
Пользователь переключается на другое приложение (через меню «Все приложения», из уведомления, при принятии звонка и т. д.)
В этом случае система остановит активити, но не завершит его сразу.
Управление состоянием
Когда ваше активити переходит в состояние Stopped, система использует onSaveInstanceState для сохранения состояния приложения на тот случай, если впоследствии система завершит процесс приложения (см. ниже).
Предполагая, что процесс не был убит, экземпляр активити сохраняется в памяти, сохраняя все состояние. Когда активити возвращается на передний план, вам не нужно повторно инициализировать компоненты, которые были созданы ранее.
Одно Aсtivity — Сценарий 3. Изменение кофигурации
Будет вызван, если:
Изменена конфигурация, такие как поворот экрана
Пользователь изменил размер окна в многооконном режиме
Управление состоянием
Изменения конфигурации, такие как поворот или изменение размера окна, должны позволить пользователям продолжить работу с того места, где они остановились.
Активити полностью уничтожено, но состояние сохраняется и восстанавливается при создании нового экземпляра.
Bundle в onCreate тот же самый, что и в onRestoreInstanceState .
Одно Aсtivity — Сценарий 4. Приложение приостановлено системой
Будет вызван, если:
Включён многооконный режим (API 24+) и потерян фокус
Другое приложение частично покрывает работающее приложение: диалоговое окно покупки (in-app purchases), диалоговое окно получения разрешения (Runtime Permission), стороннее диалоговое авторизации и т. д.
Появится окно выбора приложения (при обработке неявного интента), например диалоговое окно шейринга.
Этот сценарий не применим к:
Диалогам в том же приложении. Отображение AlertDialog или DialogFragment не приостанавливает базовое активити.
Уведомлениям. Пользователь, получающий новое уведомление или открывающий панель уведомлений, не приостанавливает текущее активити.
Источник
Перезапуск приложения Android программно
Это следующий вопрос к этому вопросу:
Я пытаюсь перезапустить приложение из такого фрагмента:
Код ничего не делает. finish() — это единственное, что работает по какой-то причине. Если я удалю finish() , ничего не произойдет. Почему это так?
6 ответов:
Если вы просто подумываете переключиться на свой начальный Activity , обратитесь к у Рикардо отвечай. Но этот подход не сбросит статический контекст вашего приложения и не перестроит класс Application , поэтому приложение не будет действительно перезапущено.
Если вы хотите полностью перезапустить свое приложение, я могу посоветовать более радикальный способ, используя PendingIntent .
P.S. попробовал ваш код в моем проекте-хорошо работает с finish() и без finish() . Так что, может быть, у вас есть что-то конкретное о Вашей деятельности или фрагмент, который вы не написали.
Как только вы добавите это FLAGS к намерению
И вызов startActivity() , он очистит все другие действия, включая то, из которого вы вызываете это, поэтому вызов finish() после startActivity() закроет начатое действие.
В основном, удалить getActivity().finish() .
Это начало вашей домашней деятельности и отказ от всех других видов деятельности. Это выглядит как перезагрузка для пользователей, но процесс тот же самый.
Источник