перезапуск приложения android studio

Как программно «перезапустить» приложение для Android?

Можно принудительно получить блокировку, поскольку пользователь может удалить приложение и переустановить его, что приведет к другому идентификатору экземпляра, и пользователь больше не сможет освободить блокировку. Поэтому можно принудительно получить блокировку.

Из-за этой силовой возможности нам нужно всегда проверять конкретный пример, что он имеет блокировку. Это делается на (почти) каждом запросе на сервер. Сервер может послать «неверный-lock-id». Если это обнаружено, клиентское приложение должно удалить все.

Это был прецедент. Нет для вопроса реализации:

У меня есть Activity A, который запускает Login Activity L или главное приложение Activity B в зависимости от поля sharedPrefs. После запуска L или B он закрывается, так что работает только L или B. Таким образом, в том случае, если пользователь уже зарегистрирован в B, выполняется сейчас.

B запускает C. C вызывает startService для IntentService D. Это приводит к этому стеку:

Из метода onHandleIntent D событие отправляется на ResultReceiver R.

Метод Dialog onClick выглядит следующим образом:

Итак, как я могу решить это, чтобы стек активности стал (A) > L?

20 ответов

Вы можете просто позвонить:

Что используется в ProcessPhoenix библиотеке

В качестве альтернативы:

Здесь немного улучшена версия ответа @Oleg Koshkin.

Это также приведет к повторной инициализации jni-классов и всех статических экземпляров.

Джейк Уортон недавно опубликовал свою библиотеку ProcessPhoenix, которая делает это надежным способом. Вам в основном нужно только позвонить:

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

IntentCompat.makeRestartActivityTask

Новый способ сделать это, используя IntentCompat.makeRestartActivityTask

Сделать намерение, которое можно использовать для повторного запуска приложения в его базовое состояние. Это похоже на makeMainActivity (ComponentName), но также устанавливает флаги Intent.FLAG_ACTIVITY_NEW_TASK и FLAG_ACTIVITY_CLEAR_TASK.

Если вы хотите наблюдать за эффектом этой функции, добавьте переменную static в свою активность и увеличите ее, скажем, нажатием кнопки. Если вы выйдете из активности приложения и затем снова запустите приложение, эта статическая переменная сохранит свое значение. (Если приложение действительно было завершено, переменной присваивается начальное значение.)

(И я должен прокомментировать, почему я не хотел исправлять ошибку. Библиотека была написана несколько десятилетий назад и с тех пор исчерпала ресурсы. Руководство полагает, что это всегда сработало. Стоимость предоставления исправления вместо обходного пути. Я думаю, вы поняли эту идею.)

Теперь, как я мог reset jni shared (a.k.a. dynamic,.so) библиотека перейти в исходное состояние? Я решил перезапустить приложение как новый процесс.

Фокус в том, что System.exit() закрывает текущую активность, а Android воссоздает приложение с меньшим количеством действий.

Преимущество этого метода в том, что задержек нет.

UPD: он работал в Android 2.x, но в Android 4 что-то изменилось.

Источник

Как программно «перезапустить» приложение для Android?

Во-первых, я знаю, что нельзя действительно убивать / перезапускать приложение на Android. В моем случае я хочу, чтобы мое приложение было сброшено с завода в конкретном случае, когда сервер отправляет конкретную информацию клиенту.

Можно принудительно получить блокировку, поскольку пользователь может удалить приложение и переустановить его, что приведет к другому идентификатору экземпляра, и пользователь больше не сможет освободить блокировку. Поэтому можно принудительно получить замок.

Из-за этой силовой возможности нам нужно всегда проверять конкретный пример, что у него есть замок. Это делается на (почти) каждом запросе на сервер. Сервер может отправить «неверный-блокировать-идентификатор». Если это обнаружено, клиентское приложение должно удалить все.

Это был прецедент. Нет для вопроса реализации:

У меня есть Activity A, который запускает Activity входа L или основное действие B приложения в зависимости от поля sharedPrefs. После запуска L или B он закрывается, чтобы работать только L или B. Таким образом, в случае, когда пользователь уже зарегистрирован, уже запущен B.

B запускает C. C вызывает startService для IntentService D. Это приводит к тому, что этот стек:

Из метода onHandleIntent D событие отправляется в ResultReceiver R.

R теперь обрабатывает это событие, предоставляя пользователю диалоговое окно, в котором он может выбрать заводское сброс приложения (удалить базу данных, sharedPrefs и т. Д.).

После заводского сброса я хочу перезапустить приложение (чтобы закрыть все действия) и снова запустить A, который затем запускает Activity входа L и заканчивается:

Метод onClick диалогового окна выглядит так:

Проблема в том, что если я использую FLAG_ACTIVITY_NEW_TASK действия B и C все еще работают. Если я нажму кнопку «Назад» в действии входа в систему, я вижу C, но я хочу вернуться на главный экран.

Если я не установлю FLAG_ACTIVITY_NEW_TASK я получаю ошибку:

Итак, как я могу решить это, чтобы стек активности стал (A)> L?

Вы можете использовать PendingIntent для настройки запуска своей деятельности в будущем, а затем закрыть приложение

Вы можете просто позвонить:

Что используется в библиотеке ProcessPhoenix

Как альтернатива:

Вот немного улучшенная версия ответа @Oleg Koshkin.

Это также приведет к повторной инициализации классов jni и всех статических экземпляров.

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

Есть действительно хороший трюк. Моя проблема заключалась в том, что некоторые действительно старые библиотеки C ++ jni просочились в ресурсы. В какой-то момент он прекратил функционировать. Пользователь попытался выйти из приложения и запустить его снова – без результата, потому что завершение действия не совпадает с завершением (или убийством) процесса. (Кстати, пользователь может перейти в список запущенных приложений и остановить его там – это сработает, но пользователи просто не знают, как прекратить приложения).

Если вы хотите наблюдать эффект этой функции, добавьте static переменную в свою деятельность и увеличите ее, скажем, нажатием кнопки. Если вы выйдете из активности приложения и снова запустите приложение, эта статическая переменная сохранит свое значение. (Если приложение действительно было завершено, переменной присваивается начальное значение.)

Фокус в том, что System.exit () закрывает текущую активность, а Android воссоздает приложение с меньшим количеством действий.

Преимущество этого метода заключается в том, что нет задержек.

UPD: он работал в Android 2.x, но в Android 4 что-то изменилось.

IntentCompat.makeRestartActivityTask

Новый способ сделать это, используя IntentCompat.makeRestartActivityTask

Сделайте намерение, которое можно использовать для повторного запуска задачи приложения в его базовом состоянии. Это похоже на makeMainActivity (ComponentName), но также устанавливает флаги Intent.FLAG_ACTIVITY_NEW_TASK и FLAG_ACTIVITY_CLEAR_TASK.

И в ResultReceiver

Спасибо, в любом случае!

Мое решение не перезапускает процесс / приложение. Это позволяет приложению «перезапускать» домашнюю деятельность (и отклонять все другие действия). Это похоже на перезапуск пользователей, но процесс тот же. Я думаю, что в некоторых случаях люди хотят достичь этого эффекта, поэтому я просто оставляю его здесь FYI.

Попробуйте использовать FLAG_ACTIVITY_CLEAR_TASK

Ниже приведен пример перезапуска приложения в общем виде с помощью PackageManager:

Пример перезапуска или запуска приложения appA из приложения :

Вы можете проверить, запущено ли приложение:

Мне пришлось добавить обработчик для задержки выхода:

Я получаю имя класса Instrumentation динамически, но вы можете его жестко закодировать. Некоторым нравится:

Вызов startInstrumentation делает перезагрузку вашего приложения. Прочитайте описание этого метода. Но это может быть небезопасно, если действовать как приложение для убийства.

Приложение, над которым я работаю, должно предоставить пользователю возможность выбирать фрагменты для отображения (фрагменты динамически изменяются во время выполнения). Лучшим решением для меня было полностью перезагрузить приложение.

Поэтому я попробовал множество решений, и никто из них не работал для меня, но это:

Надеюсь, что это поможет кому-то другому!

Я думаю, он работает, начиная с уровня API 16 (4.1).

Источник

How to restart Activity in Android

21 Answers 21

I did my theme switcher like this:

Basically, I’m calling finish() first, and I’m using the exact same intent this activity was started with. That seems to do the trick?

UPDATE: As pointed out by Ralf below, Activity.recreate() is the way to go in API 11 and beyond. This is preferable if you’re in an API11+ environment. You can still check the current version and call the code snippet above if you’re in API 10 or below. (Please don’t forget to upvote Ralf’s answer!)

Since API level 11 (Honeycomb), you can call the recreate() method of the activity (thanks to this answer).

The recreate() method acts just like a configuration change, so your onSaveInstanceState() and onRestoreInstanceState() methods are also called, if applicable.

Before SDK 11, a way to do this is like so:

перезапуск приложения android studio. 3q8qF. перезапуск приложения android studio фото. перезапуск приложения android studio-3q8qF. картинка перезапуск приложения android studio. картинка 3q8qF.

Just to combine Ralf and Ben’s answers (including changes made in comments):

перезапуск приложения android studio. kTAL5. перезапуск приложения android studio фото. перезапуск приложения android studio-kTAL5. картинка перезапуск приложения android studio. картинка kTAL5.

I used this code so I still could support older Android versions and use recreate() on newer Android versions.

перезапуск приложения android studio. DcEqh. перезапуск приложения android studio фото. перезапуск приложения android studio-DcEqh. картинка перезапуск приложения android studio. картинка DcEqh.

This is by far the easiest way to restart the current activity:

перезапуск приложения android studio. lkElm. перезапуск приложения android studio фото. перезапуск приложения android studio-lkElm. картинка перезапуск приложения android studio. картинка lkElm.

This solution worked for me.

First finish the activity and then start it again.

перезапуск приложения android studio. 8hPeY. перезапуск приложения android studio фото. перезапуск приложения android studio-8hPeY. картинка перезапуск приложения android studio. картинка 8hPeY.

Even though this has been answered multiple times.

If restarting an activity from a fragment, I would do it like so:

So you might be thinking this is a little overkill? But the Handler posting allows you to call this in a lifecycle method. I’ve used this in onRestart / onResume methods when checking if the state has changed between the user coming back to the app. (installed something).

Without the Handler if you call it in an odd place it will just kill the activity and not restart it.

Feel free to ask any questions.

Well this is not listed but a combo of some that is already posted:

перезапуск приложения android studio. nCrsm. перезапуск приложения android studio фото. перезапуск приложения android studio-nCrsm. картинка перезапуск приложения android studio. картинка nCrsm.

I wonder why no one mentioned Intent.makeRestartActivityTask() which cleanly makes this exact purpose.

Make an Intent that can be used to re-launch an application’s task * in its base state.

This method sets Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK as default flags.

перезапуск приложения android studio. eMjQ1. перезапуск приложения android studio фото. перезапуск приложения android studio-eMjQ1. картинка перезапуск приложения android studio. картинка eMjQ1.

If anybody is looking for Kotlin answer you just need this line.

Fragment

Activity

перезапуск приложения android studio. 9wbFT. перезапуск приложения android studio фото. перезапуск приложения android studio-9wbFT. картинка перезапуск приложения android studio. картинка 9wbFT.

There is one hacky way that should work on any activity, including the main one.

When orientation changes, Android generally will recreate your activity (unless you override it). This method is useful for 180 degree rotations, when Android doesn’t recreate your activity.

In conjunction with strange SurfaceView lifecycle behaviour with the Camera. I have found that recreate() does not behave well with the lifecycle of SurfaceViews. surfaceDestroyed isn’t ever called during the recreation cycle. It is called after onResume (strange), at which point my SurfaceView is destroyed.

The original way of recreating an activity works fine.

I can’t figure out exactly why this is, but it is just an observation that can hopefully guide others in the future because it fixed my problems i was having with SurfaceViews

перезапуск приложения android studio. WVnDF. перезапуск приложения android studio фото. перезапуск приложения android studio-WVnDF. картинка перезапуск приложения android studio. картинка WVnDF.

The solution for your question is:

You need to cast to activity context to start new activity and as well as to finish the current activity.

Hope this helpful..and works for me.

Actually the following code is valid for API levels 5 and up, so if your target API is lower than this, you’ll end up with something very similar to EboMike’s code.

перезапуск приложения android studio. nYkXL. перезапуск приложения android studio фото. перезапуск приложения android studio-nYkXL. картинка перезапуск приложения android studio. картинка nYkXL.

If you remove the last line, you’ll create new act Activity, but your old instance will still be alive.

Do you need to restart the Activity like when the orientation is changed (i.e. your state is saved and passed to onCreate(Bundle) )?

If you need to save most of the state, you are getting in pretty deep waters, because it’s non-trivial to pass all the properties of your state, especially without leaking your old Context/Activity, by passing it to the new instance.

Источник

Как перезагрузить приложение в Genymotion и Android Studio без перезагрузки эмулятора?

Я использую Android Studio 0.9.9 и Genymotion 2.3.1.

Когда я нажимаю запустить приложение в Android Studio, Android Studio позволит мне выбрать для развертывания моего приложения в Genymotion, которое я обычно делаю.

На этом этапе приложение запущено.

Скажем, в этот момент я хочу внести изменения в код.

Я сохранил изменения в Android Studio.

Как перезагрузить мои изменения и переустановить приложение, не перезагружая Genymotion?

EDIT В конечном счете, просто обновление до последней стабильной загрузки Android Studio было решением.

Редактирование с учетом вашего комментария Reload being the fact that if my app has a button in activity A, and I press it, and it opens activity B, and I go back to Android Studio to type a comment, I want to reload the app and it auto starts right back at activity A

И поместите его внутри кода действия B, с которого вы хотите начать свое приложение.

Нажмите F1 в Genymotion и нажмите «Перезапустить JS», чтобы начать разработку адаптивных приложений.

Нажмите F2 для эмулятора Android Studio.

-Отключить эмулятор
-В окне Genymotion щелкните значок настроек infront имени устройства
-under «Настройки системы Android», установите флажок «Показать панель навигации Android»,
-click ok и запустить эмулятор

Я встретил аналогичную проблему в Android 2.3.7 под Genymotion. Я только что закрыл приложение перед запуском

Вам действительно не нужно ничего делать. Когда вы нажимаете кнопку IDE для создания и развертывания приложения. Android Studio закроет его, установит, а затем запустит снова, включая ваши изменения.

Что происходит на вашей стороне?

Кстати, я действительно советую вам обновить Android Studio, поскольку версия 1.0, мягкая, очень стабильна и ведет себя так, как ожидалось.

Источник

Как программно «перезапустить» приложение Android?

Во-первых, я знаю, что не нужно действительно убивать / перезапускать приложение на Android. В моем случае использования я хочу сбросить заводские настройки моего приложения в конкретном случае, когда сервер отправляет конкретную информацию клиенту.

Пользователь может быть авторизован на сервере только с ОДНЫМ экземпляром приложения (т.е. несколько устройств не допускаются). Если другой экземпляр получает этот «вход в систему», тогда все остальные экземпляры этого пользователя должны удалить свои данные (сброс к заводским настройкам), чтобы сохранить согласованность.

Можно принудительно получить блокировку, потому что пользователь может удалить приложение и переустановить его, что приведет к другому идентификатору экземпляра, и пользователь больше не сможет снять блокировку. Поэтому можно принудительно получить блокировку.

Из-за этой форсированной возможности мы должны всегда проверять в конкретном случае, что он имеет блокировку. Это делается для (почти) каждого запроса к серверу. Сервер может отправить «неправильный идентификатор блокировки». Если это обнаружено, клиентское приложение должно удалить все.

Это был вариант использования. Нет для реализации-вопрос:

у меня есть Activity А, который запускает Логин Activity L или главное приложение Activity B в зависимости от поля sharedPrefs. После запуска L или B он закрывается, так что работает только L или B. Таким образом, в случае, если пользователь вошел в систему уже B работает сейчас.

B начинает C. C звонки startService для IntentService D. Это приводит к этому стеку:

Из метода onHandleIntent в D событие отправляется ResultReceiver R.

Теперь R обрабатывает это событие, предоставляя пользователю диалоговое окно, в котором он может выбрать заводскую настройку приложения (удалить базу данных, sharedPrefs и т. Д.).

После сброса к заводским настройкам я хочу перезапустить приложение (чтобы закрыть все действия) и только снова запустить A, который затем запускает логин Activity Л и заканчивает себя:

OnClick-метод Диалога выглядит так:

И это MyApp учебный класс:

Проблема в том, что если я использую FLAG_ACTIVITY_NEW_TASK Действия B и C все еще выполняются. Если я нажму кнопку «Назад» при входе в систему Activity Я вижу C, но я хочу вернуться на домашний экран.

Если я не установлю FLAG_ACTIVITY_NEW_TASK Я получаю ошибку:

Так, как я мог решить это, чтобы стек активности стал (A) > L?

30 ответов

Ты можешь использовать PendingIntent настроить запуск вашей стартовой деятельности в будущем, а затем закрыть приложение

Вы можете просто позвонить:

Который используется в библиотеке ProcessPhoenix

Как альтернатива:

Вот немного улучшенная версия ответа @Oleg Koshkin.

Если вы действительно хотите возобновить свою деятельность, включая уничтожение текущего процесса, попробуйте следующий код. Поместите его в HelperClass или там, где вам это нужно.

Это также повторно инициализирует классы jni и все статические экземпляры.

Я немного изменил ответ Ilya_Gazman для использования новых API (IntentCompat устарел, начиная с API 26). Runtime.getRuntime(). Exit(0) выглядит лучше, чем System.exit(0).

Джейк Уортон недавно опубликовал свою библиотеку ProcessPhoenix, которая делает это надежным способом. Вам в основном нужно только позвонить:

Библиотека автоматически завершит вызывающее действие, завершит процесс приложения и впоследствии перезапустит действие приложения по умолчанию.

IntentCompat.makeRestartActivityTask

Новый способ сделать это, используя IntentCompat.makeRestartActivityTask

Создайте намерение, которое можно использовать для повторного запуска задачи приложения в ее базовом состоянии. Это похоже на makeMainActivity(ComponentName), но также устанавливает флаги Intent.FLAG_ACTIVITY_NEW_TASK и FLAG_ACTIVITY_CLEAR_TASK.

Мое решение не перезапускает процесс / приложение. Это только позволяет приложению «перезапустить» домашнюю активность (и отклонить все остальные действия). Это выглядит как перезапуск для пользователей, но процесс такой же. Я думаю, что в некоторых случаях люди хотят добиться этого эффекта, поэтому я просто оставляю это здесь, к вашему сведению.

Если вы хотите наблюдать эффект от этой функции, добавьте static изменяйте свою активность и увеличивайте ее, скажем, нажатием кнопки. Если вы выйдете из активности приложения, а затем снова вызовете приложение, эта статическая переменная сохранит свое значение. (Если приложение действительно было закрыто, переменной будет присвоено начальное значение.)

(И я должен прокомментировать, почему я не хотел вместо этого исправлять ошибку. Библиотека была написана десятилетия назад и с тех пор утечка ресурсов. Руководство считает, что это всегда работало. Стоимость предоставления исправления вместо обходного пути. Я думаю, вы поняли.)

Хитрость в том, что System.exit() закрывает текущее действие, а Android заново создает приложение с одним действием меньше.

Вызывающая активность просто выполняет код MagicAppRestart.doRestart(this); Вызывающая деятельность onPause() выполняется, а затем процесс воссоздается. И не забудьте упомянуть об этой активности в AndroidManifest.xml

Преимущество этого метода в том, что нет задержек.

UPD: в Android 2.x он работал, но в Android 4 что-то изменилось.

Это было сделано, когда активность запуска в приложении имеет следующее:

Я видел комментарии, в которых утверждалось, что необходима категория DEFAULT, но я не обнаружил, что это так. Я подтвердил, что объект Application в моем приложении воссоздан, поэтому я считаю, что процесс действительно был остановлен и перезапущен.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *