Different Ways to Programmatically Restart an Android App on Button Click
Sometimes we want to refresh an Activity, but there it is not possible to refresh. In that place, if we restart our app then it automatically gets refreshed. Also, we can use this to restart our app whenever it crashes. Most of the time when we open any app then it fetches all the data currently available. But if in the meantime if more data is updated to the database then we can use this feature to restart to again fetch all data every time it gets new data.
Now the point that comes here is how we can Programmatically Restart an Android App on Button Click . So in this article, we are going to discuss three different methods to Programmatically Restart an Android App on Button Click.
Attention reader! Don’t stop learning now. Get hold of all the important Java Foundation and Collections concepts with the Fundamentals of Java and Java Collections Course at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer Complete Interview Preparation Course.
Step by Step Implementation
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Java as the programming language.
Источник
Как программно «перезапустить» приложение Android?
Во-первых, я знаю, что не нужно действительно убивать / перезапускать приложение на Android. В моем случае использования я хочу сбросить заводские настройки моего приложения в конкретном случае, когда сервер отправляет конкретную информацию клиенту.
Пользователь может быть авторизован на сервере только с ОДНЫМ экземпляром приложения (т.е. несколько устройств не допускаются). Если другой экземпляр получает этот «вход в систему», тогда все остальные экземпляры этого пользователя должны удалить свои данные (сброс к заводским настройкам), чтобы сохранить согласованность.
Можно принудительно получить блокировку, поскольку пользователь может удалить приложение и переустановить его, что приведет к другому идентификатору экземпляра, и пользователь больше не сможет снять блокировку. Поэтому можно принудительно получить блокировку.
Из-за этой принудительной возможности мы должны всегда проверять в конкретном случае, что он имеет блокировку. Это делается для (почти) каждого запроса к серверу. Сервер может отправить «неправильный идентификатор блокировки». Если это обнаружено, клиентское приложение должно удалить все.
Это был вариант использования.
У меня есть Activity A, который запускает Login Activity L или основной Activity B приложения в зависимости от значения sharedPrefs. После запуска L или B он закрывается, так что работает только L или B. Таким образом, в случае, если пользователь вошел в систему уже B работает сейчас.
B начинает звонить C. C startService для IntentService D. Это результаты в этом стеке:
Из метода onHandleIntent в D событие отправляется ResultReceiver R.
Теперь R обрабатывает это событие, предоставляя пользователю диалоговое окно, в котором он может выбрать заводскую настройку приложения (удалить базу данных, sharedPrefs и т. Д.).
После сброса к заводским настройкам я хочу перезапустить приложение (чтобы закрыть все действия) и только снова запустить A, который затем запускает логин Activity L и завершает себя:
OnClick-метод Диалога выглядит следующим образом:
И это MyApp класс:
Проблема в том, что если я использую FLAG_ACTIVITY_NEW_TASK Действия B и C, все еще выполняется. Если я нажимаю кнопку «Назад» при входе в систему, Activity я вижу C, но я хочу вернуться на домашний экран.
Если я не установил, FLAG_ACTIVITY_NEW_TASK я получаю ошибку:
Я не могу использовать Действия » Context , потому что ServiceIntent D также может вызываться из фоновой задачи, которая запускается AlarmManager .
Так, как я мог решить это, чтобы стек активности стал (A)> L?
Вы можете использовать его PendingIntent для запуска запуска в будущем, а затем для закрытия приложения.
Вы можете просто позвонить:
Который используется в библиотеке ProcessPhoenix
Как альтернатива:
Вот немного улучшенная версия ответа @Oleg Koshkin.
Если вы действительно хотите возобновить свою деятельность, включая уничтожение текущего процесса, попробуйте следующий код. Поместите его в HelperClass или там, где вам это нужно.
Это также повторно инициализирует классы jni и все статические экземпляры.
Джейк Уортон недавно опубликовал свою библиотеку ProcessPhoenix , которая делает это надежным способом. Вам в основном нужно только позвонить:
Библиотека автоматически завершит вызывающее действие, завершит процесс приложения и впоследствии перезапустит действие приложения по умолчанию.
Я немного изменил ответ Ilya_Gazman для использования новых API (IntentCompat устарел, начиная с API 26). Runtime.getRuntime (). Exit (0) кажется лучше, чем System.exit (0).
IntentCompat.makeRestartActivityTask
Новый способ сделать это, используя IntentCompat.makeRestartActivityTask
Создайте намерение, которое можно использовать для повторного запуска задачи приложения в ее базовом состоянии. Это похоже на makeMainActivity (ComponentName), но также устанавливает флаги Intent.FLAG_ACTIVITY_NEW_TASK и FLAG_ACTIVITY_CLEAR_TASK.
Есть действительно хороший трюк. Моя проблема заключалась в том, что в какой-то действительно старой C ++ jni библиотеке произошла утечка ресурсов. В какой-то момент он перестал функционировать. Пользователь попытался выйти из приложения и запустить его снова — безрезультатно, потому что завершение действия — это не то же самое, что завершение (или уничтожение) процесса. (Кстати, пользователь может перейти к списку запущенных приложений и остановить его оттуда — это будет работать, но пользователи просто не знают, как завершать приложения.)
Если вы хотите наблюдать за эффектом этой функции, добавьте static переменную к своей деятельности и увеличивайте ее, скажем, нажатием кнопки. Если вы выйдете из активности приложения, а затем снова вызовете приложение, эта статическая переменная сохранит свое значение. (Если приложение действительно было закрыто, переменной будет присвоено начальное значение.)
(И я должен прокомментировать, почему я не хотел вместо этого исправлять ошибку. Библиотека была написана десятилетия назад и с тех пор утечка ресурсов. Руководство считает, что это всегда работало . Стоимость предоставления исправления вместо обходного пути . Я думаю, вы поняли.)
Теперь, как я могу сбросить разделяемую библиотеку jni (она же динамическая, .so) в исходное состояние? Я решил перезапустить приложение как новый процесс.
Хитрость в том, что System.exit () закрывает текущее действие, а Android заново создает приложение с одним действием меньше.
Вызывающее действие просто выполняет код MagicAppRestart.doRestart(this); , вызывающее действие onPause() выполняется, а затем процесс создается заново. И не забудьте упомянуть об этой активности в AndroidManifest.xml
Преимущество этого метода в том, что нет задержек.
UPD: в Android 2.x он работал, но в Android 4 что-то изменилось.
Источник
Установить приложение программно на Android
Мне интересно знать, возможно ли программно установить динамически загруженный apk из пользовательского приложения для Android.
Вы можете легко запустить ссылку на магазин Play Play или приглашение к установке:
Однако вы не можете установить .apks без явного разрешения пользователя ; нет, если устройство и ваша программа не рутированы.
У меня была такая же проблема, и после нескольких попыток у меня все получилось. Я не знаю почему, но установка данных и типа по отдельности провалила мои намерения.
Решения, предоставленные на этот вопрос, все применимы к targetSdkVersion с 23 и ниже. Однако для Android N, то есть уровня API 24 и выше, они не работают и аварийно завершают работу со следующим исключением:
Это связано с тем, что, начиная с Android 24, Uri изменился адрес для загруженного файла. Например, установочный файл с именем, appName.apk хранящимся в основной внешней файловой системе приложения с именем пакета, com.example.test будет иметь вид
для API 23 и ниже, тогда как что-то вроде
за API 24 и выше.
Более подробную информацию об этом можно найти здесь, и я не собираюсь проходить через это.
Чтобы ответить на вопрос targetSdkVersion о 24 и выше, необходимо выполнить следующие шаги: Добавьте следующее в AndroidManifest.xml:
2. Добавьте следующий paths.xml файл в xml папку res в src, main:
Это pathName то, что показано в приведенном выше примере содержимого и pathValue является фактическим путем в системе. Было бы неплохо поставить «.» (без кавычек) для pathValue в приведенном выше, если вы не хотите добавлять какие-либо дополнительные подкаталоги.
Напишите следующий код для установки apk с именем appName.apk в основной внешней файловой системе:
Разрешение также не требуется при записи в личный каталог вашего приложения во внешней файловой системе.
Я написал здесь библиотеку автообновления, в которой я использовал вышеизложенное.
Источник
Установить приложение программно на Android
Мне интересно знать, возможно ли программно установить динамически загруженный apk из пользовательского приложения для Android.
Вы можете легко запустить ссылку на магазин Play Play или приглашение к установке:
Однако вы не можете установить .apks без явного разрешения пользователя ; нет, если устройство и ваша программа не рутированы.
У меня была такая же проблема, и после нескольких попыток у меня все получилось. Я не знаю почему, но установка данных и типа по отдельности провалила мои намерения.
Решения, предоставленные на этот вопрос, все применимы к targetSdkVersion с 23 и ниже. Однако для Android N, то есть уровня API 24 и выше, они не работают и аварийно завершают работу со следующим исключением:
Это связано с тем, что, начиная с Android 24, Uri изменился адрес для загруженного файла. Например, установочный файл с именем, appName.apk хранящимся в основной внешней файловой системе приложения с именем пакета, com.example.test будет иметь вид
для API 23 и ниже, тогда как что-то вроде
за API 24 и выше.
Более подробную информацию об этом можно найти здесь, и я не собираюсь проходить через это.
Чтобы ответить на вопрос targetSdkVersion о 24 и выше, необходимо выполнить следующие шаги: Добавьте следующее в AndroidManifest.xml:
2. Добавьте следующий paths.xml файл в xml папку res в src, main:
Это pathName то, что показано в приведенном выше примере содержимого и pathValue является фактическим путем в системе. Было бы неплохо поставить «.» (без кавычек) для pathValue в приведенном выше, если вы не хотите добавлять какие-либо дополнительные подкаталоги.
Напишите следующий код для установки apk с именем appName.apk в основной внешней файловой системе:
Разрешение также не требуется при записи в личный каталог вашего приложения во внешней файловой системе.
Я написал здесь библиотеку автообновления, в которой я использовал вышеизложенное.
Источник