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

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Примечание: Я также видел этот вопрос: Как остановить отладку, не закрывая приложение в Android Studio 2 - Однако в моем случае нет кнопки стоп! я просто отключил

удалите этот apk вручную с устройства и попробуйте установить его заново.

Ответы 1

Сделайте одно из:

Вы либо случайно установили точку останова, неправильно щелкнув Ctrl + F8, либо просто щелкнув левой кнопкой мыши по счетчику строк. Так что просмотрите свой код для этого.

  • Совет: Если вы не уверены в этом, создайте новый проект и установите его, если он работает, скорее всего, это ошибка, с которой вы столкнулись.

Вы выбрали приложение для отладки. Перейдите в настройки вашего телефона -> Параметры разработчика -> Выберите приложение для отладки -> Нет приложений. Это очистит его.

Удалите свой apk и переустановите его заново.

Эх, это ничего не меняет.

Оооо, прошу прощения, вы запускаете его на своем мобильном устройстве? ЕСЛИ вы затем перейдите в настройки вашего телефона -> Параметры разработчика -> Выберите приложение для отладки -> Нет приложений

Спасибо! Да, это была отладка приложения в настройках планшета. Глупый я, забыл об этом :)

Debug cat

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

Когда вы разрабатываете приложение, то студия собирает отладочную версию программы, соединяется с устройством/эмулятором, устанавливает и запускает её.

Обычно для запуска приложения вы используете значок с зелёным треугольником Run (Shift+F10) на панели инструментов. Для отладки следует нажимать соседнюю кнопку Debug (Shift+F9) с изображением жучка .

Остальные действия будут идентичными - вам надо выбрать устройство, на котором будет происходить отладка.

Android Studio откроет окно Debug. Можно открыть его вручную через кнопку 5: Debug в нижней части среды разработки. Окно показывает потоки и переменные в вкладке Debugger, статус устройства в вкладке Console и системные логи в вкладке Logcat.


Если приложение уже запущено, то необязательно его перезапускать для работы в отладочном режиме. Вы можете нажать на кнопку Attach debugger to Android proccess , которая идёт сразу после кнопку с жучком.


Логи можно просматривать также через панель Android DDMS (Dalvik Debug Monitor Server) - запускается через кнопку 5: Android в нижней части студии. В Android DDMS вы можете просматривать логи только нужного процесса, если нажмёте на кнопку Only Show Logcat from Selected Process .

Точки останова (Breakpoints)

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

Откройте свой исходник, определите строку кода, в которой хотите поставить точку останова и щёлкните по ней. Строка окрасится в жёлтый цвет. Щёлкните в левой части редактора кода в серой области. В этом месте появится красный кружок (повторный щелчок уберёт его), а строка примет розовый цвет. Точку останова можно ставить не только для исполняемого оператора, но и на комментарии.

Запустите приложение в отладочном режиме. Когда выполнение программы дойдёт до установленной точки останова, то студия прекратит дальнейшее выполнение приложения, кружок станет ещё более красным и строка будет выделена. И затем вы можете попытаться выявить причину ошибки.


Для просмотра всех точек останова и их настроек щёлкните на кнопке View Breakpoints в левой части панели Debug . Появится отдельное диалоговое окно.



После того, как вы установили точки останова, щёлкните кнопку Rerun для повторного запуска программы. Когда выполнение кода дойдёт до установленной точки останова, студия выполнит паузу и подсветить строку кода. Панель Debug позволит проверить переменную и выполнить код шаг за шагом.

Для проверки переменных раскройте список в панели Variables. Если панель не видна, то щёлкните кнопку Restore Variables

Для вычисления выражения в текущей точки щёлкните кнопку Evaluate Expression

Для перехода на следующую строку кода без выполнения щёлкните кнопку Step Over .

Для перехода на первую строку кода внутри метода щёлкните кнопку Step Into .

Для перехода на следующую строку за пределами текущего метода щёлкните кнопку Step Out .

Чтобы продолжить работу приложения в нормальном режиме, нажмите кнопку Resume Program .

Отслеживание потребления памяти

Студия позволяет также отслеживать потребления памяти объектами и показывает, какие классы и потоки используют объекты.

Запустите студия в отладочном режиме, щёлкните 6: Android, чтобы открыть панель Android DDMS. Выберите вкладку Devices | logcat, выберите ваше устройство из выпадающего списка, выберите вашу программу по имени пакета из списка запущенных программ.


Щёлкните кнопку Start Allocation Tracking . Начинайте пользоваться программой.

Повторно нажмите на предыдущую кнопку Stop Allocation Tracking. Студия покажет объекты, выделенные системой для работы.

Android Device Monitor

Для анализа потребления памяти, сетевого трафика, поведения приложения при входящих звонках можно использовать графический инструмент Android Device Monitor. Щёлкните кнопку Monitor на панели инструментов. Android Device Monitor откроется в новом окне. Опытные программисты увидят знакомое окно, когда работали с Eclipse.

Скриншоты и видео

Вы можете делать скриншоты и видео работающего приложения.


Запустите приложение и откройте панель 6: Android. Щёлкните кнопку Screen Capture в левой части панели.


По такому же принципу можно сделать видеозапись через кнопку

Во-первых, я знаю, что не нужно действительно убивать / перезапускать приложение на 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 Я получаю ошибку:

Я не могу использовать деятельность " Context , поскольку ServiceIntent D также может вызываться из фоновой задачи, которая запускается AlarmManager ,

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

Ты можешь использовать 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

Итак, в прошлый раз мы создали первое приложение для андроид, используя AndroidStudio, наше приложение получилось проще некуда, в поле для ввода пишем текст, при нажатии на кнопку BUTTON это текст попадал в текстовое поле, меняя тем самым надпись.

Проще только форма с кнопкой закрыть приложение, кстати, а как изменить текст на кнопке спросите вы? Очень просто, аж двумя способами, не считая программного…

Первый способ изменить текст на кнопке - hardcore

Откроем файл main.xml, и в свойствах элемента Button - android:text="Button" в скобках напишем "Нажми меня!", перейдем в Design вид и надпись на кнопке поменяется. Хотя это считается хардкором и вообще дурным тоном.

Второй способ изменить текст на кнопке - strings.xml

Слева в инспекторе проекта по путь res/values/ откроем файл strings.xml (строки), добавим новую строку либо скопировав предыдущую, либо набрав вручную либо нажав комбинацию клавиш ctrl+D, продублировав верхнюю строку. Поменяем свойство name на любое на английском, и главное имя должно быть уникальное, иначе получите предупреждение об ошибке, я написал "my_button".

Между скобками тот же текст "Нажми меня!", сохранили и закрыли. Теперь в main.xml свойство текст у кнопки в скобках напишем "@string/my_button", система сама вам поможет при вводе текста, и предложит в раскрывающемся списке содержимое файла strings.xml.

Перейдем снова с дизайнерский вид и увидим что текст изменился. Далее у поля ввода текста EditText оставим значение text пустым, что бы надпись Name не появлялась при запуске приложения.

Новая кнопка - "Очистить"

Добавим перетаскиванием на форму еще одну кнопку, в файле strings.xml добавим еще одну текстовую строчку и именем "my_button2" и значением "Очистить".

Создадим переменную b2 типа Button и найдем ее по id через findviewById(R.id.button2), в main.xml button2 это id новой кнопки.

Как написать обработчик нажатия на кнопку

Напишем обработчик нажатия на кнопку b2, при этом переменная ed связанная с текстовым полем и txt наша надпись получат через функцию setText() текст "" (пустые скобки).

Проверим, запустив приложение, введем текст, нажмем на кнопку "Нажми меня!" затем на кнопку "Очистить", все работает.

Теперь добавим ниже второй кнопки еще одну, она нужна будет для закрытия приложения, снова в strings.xml добавим строку, нажав ctrl+D, с именем "my_button3"и текстом "Выход", сохраним и закроем.

В файле main.xml для id button3 в свойстве text пропишем "@string/my_button3".

Снова создадим переменную типа button b3, свяжем ее через id используя findViewById(R.id.button3), и напишем еще один обработчик нажатия на кнопку с одной функцией finish().

Запуск приложения в эмуляторе

Как можно догадаться из названия finish он и в Африке финиш, при нажатии на эту кнопку наше приложение будет закрыто.

Android приложение за 5 минут. Часть 2

Запустим приложение и проверим, как все работает. Текст добавляется, затем очищается, и форма закрывается, как и было задумано.

Полный текст main.xml

Полный текст MainActivity.java

Полный текст strings.xml

Как создать андроид приложение за 5 минут (Продолжение):

Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!

Читайте также: