- Exit in android programming
- Second, processes
- Third, according to the life cycle of Activity
- Fourth, task manager
- Exit in android programming
- Exit the program anytime, anywhere
- Android: Two confirmation exit applications
- Introduction to several elegant ways to exit APP in Android
- Problems about APP exit, perfect exit
- Android: achieve the effect of «press again to exit the program»
- Android security exits the application method summary
- Android Click twice to return to the proper code key to exit the program
- Realize the function of «click again to exit the program» in Android
- Android press the return key to exit the program but not destroy
- The code implementation of «press again to exit the program» in Android
- Mui integrates Android to realize screen exit, session timeout exit
- Android—Tips: How to achieve the effect of «press again to exit the program»
- Android Press again to exit the program (analog Home button to exit)
- Android double-click to exit the program — Return to the previous interface
- Exit in android programming
- Second, processes
- Third, according to the life cycle of Activity
- Fourth, task manager
- Android Process: Я тебя породил, я тебя и …
- Ситуация 1: Статик — это не надёжно
- Ситуация 2: setRetainInstance как решение всех проблем
- Ситуация 3: Разорванные нити
- Ситуация 4: Письмо в никуда
- Заключение
Exit in android programming
This method only ends the current Activity, and the system will remove the top Activity out of the stack and do not clean up the resource occupied. If there is a lot of Activity in the stack, use this method a bit stretched, no way to remove all Activity, and did not immediately release the memory, and the resource of the activity is not cleared.
Second, processes
1、KillProcess()
You can kill the current application of the current application activity, which will turn all the resources within the process (including threads). Of course, because the ActivityManager is always listening to the process, once the process is found to be abnormal KILL, it will try to restart this process.
2、System.exit():
The process of ending the process in Java, calls it to close the current JVM virtual machine.
KillProcess () and system.exit (), many people have used it, this measure is effective when there is only one activity in your stack. But when there is multiple Activity when closing multiple Activity, these two methods don’t work.
Because it is considered to be abnormal by the system, it is considered an abnormality to exit, and some status information of the application is saved, such as the Activity Run, and then restore this app. When a Android application is restored, the anomalous Activity is removed from the stack, which is equivalent to the Back key operation.
Third, according to the life cycle of Activity
Android’s window class provides historical stacks that can be cleverly implemented through the principles of Stack. When the A window opens the B window, add the INTENT.FLAG_ACTIVITY_CLAR_TOP directly in Intent, which is turned on, and all Activity of the process space will be cleared.
1. When you call this method in the A window to jump to the B window:
2, use the finish method directly to exit when the B window exits
Fourth, task manager
The system will terminate everything and this package is associated. All processs that share the same UID will be killed, and the relevant services will be stopped and will send a broadcast.
However, after Android 2.2 (API 8), the RestartPackage method has been out of time, and you cannot end the application, you need to use the KillbackgroundProcesses method for the ActivityManager class.
Источник
Exit in android programming
There are several ways to quit the android app: activity queue mode, broadcast mode. Here is a look at the way I implement this feature — the observer mode. The general idea of the method is: establ.
Exit the program anytime, anywhere
Exiting the program anytime, anywhere means that no matter where you are on the page, you can exit the program most directly, without having to click the Back button again and again, although clicking.
Android: Two confirmation exit applications
Preface: Two ways to exit the application are written, and the second is preferred.ヾ (1 ╹◡╹) ノ » When the Android app exits, the play box UI confirms the display: Android second confirmation exit.
Introduction to several elegant ways to exit APP in Android
Our attitude is: Progress a little bit every day, and the ideal will eventually be realized. Foreword Recently, due to the modification of the project, the project was changed from MainActivity by pre.
Problems about APP exit, perfect exit
There will be a lot about the APP’s exit problem in actual development, and I personally have two types: First, double click to exit For example, we need a method of double-click an exit when we are o.
Android: achieve the effect of «press again to exit the program»
Foreword Do you often receive the small function requirements of «press again to exit the program» as shown in the figure below? There are many ways to implement this function, the most comm.
Android security exits the application method summary
Android security exits the application method summary Normally close the app: When the application is no longer used, it is usually necessary to close the application, and the following three methods .
Android Click twice to return to the proper code key to exit the program
Online error code is TimeTask has been running, not canceled, so there are flaws. That is, after a few clicks, I find obviously clicked once, withdrew from the code logic in question. Solutions.
Realize the function of «click again to exit the program» in Android
background achieve A little bit of progress every dayCome on background Today, I will add a more practical feature to my Android application: you can only exit the current application after clicking t.
Android press the return key to exit the program but not destroy
I was debugging the program recently and found that every time I press the return key, I always exit to the desktop. You must re-enter from the startup interface to open it again, but WeChat QQ is not.
The code implementation of «press again to exit the program» in Android
As shown in the code above, you can override the onKeyDown method in the main Activity (if onKeyDown does not respond, you can use dispatchKeyEvent instead, and onKeyDown for general activities is fin.
Mui integrates Android to realize screen exit, session timeout exit
Prerequisite: The first time I contact the Android system, the system is MUI framework and H5 and Android. I want to exit the program when the screen is realized in the Android system, and exit the pr.
Android—Tips: How to achieve the effect of «press again to exit the program»
Implementation principle: need to be in the exit page activityCopy onKeyDown()methodRealize functional logic to realize this function.
Android Press again to exit the program (analog Home button to exit)
Android project There are various ways to exit the program, but the basic idea roughly divided into two types: a direct method by finish exit the program (); 2 analog Home key to exit the program oper.
Android double-click to exit the program — Return to the previous interface
Directly on the code Rewrite the onKeyDown method The middle if is my own judgment. You don’t need to delete it. @Override public boolean onKeyDown(int keyCode, KeyEvent event) < if (keyCode == KeyEve.
Источник
Exit in android programming
This method only ends the current Activity, and the system will remove the top Activity out of the stack and do not clean up the resource occupied. If there is a lot of Activity in the stack, use this method a bit stretched, no way to remove all Activity, and did not immediately release the memory, and the resource of the activity is not cleared.
Second, processes
1、KillProcess()
You can kill the current application of the current application activity, which will turn all the resources within the process (including threads). Of course, because the ActivityManager is always listening to the process, once the process is found to be abnormal KILL, it will try to restart this process.
2、System.exit():
The process of ending the process in Java, calls it to close the current JVM virtual machine.
KillProcess () and system.exit (), many people have used it, this measure is effective when there is only one activity in your stack. But when there is multiple Activity when closing multiple Activity, these two methods don’t work.
Because it is considered to be abnormal by the system, it is considered an abnormality to exit, and some status information of the application is saved, such as the Activity Run, and then restore this app. When a Android application is restored, the anomalous Activity is removed from the stack, which is equivalent to the Back key operation.
Third, according to the life cycle of Activity
Android’s window class provides historical stacks that can be cleverly implemented through the principles of Stack. When the A window opens the B window, add the INTENT.FLAG_ACTIVITY_CLAR_TOP directly in Intent, which is turned on, and all Activity of the process space will be cleared.
1. When you call this method in the A window to jump to the B window:
2, use the finish method directly to exit when the B window exits
Fourth, task manager
The system will terminate everything and this package is associated. All processs that share the same UID will be killed, and the relevant services will be stopped and will send a broadcast.
However, after Android 2.2 (API 8), the RestartPackage method has been out of time, and you cannot end the application, you need to use the KillbackgroundProcesses method for the ActivityManager class.
Источник
Android Process: Я тебя породил, я тебя и …
Вы когда-нибудь задумывались о том, что происходит с вашим приложением после того, как система убила его процесс за ненадобностью? Печально, но многие об этом даже не беспокоятся, словно это будет происходить в параллельной вселенной и их это не касается. Особенно этому подвержены новички. Их слепая вера в непоколебимость статик ссылок просто поражает.
В этой статье я расскажу о некоторых ошибках, которые могут возникнуть в результате нарушения шестой заповеди (не убей) по отношению к процессу приложения, и о том как проверить на сколько качественно он возвращается с того света.
Ни для кого не секрет, что процесс может быть убит системой. А вы интересовались, реально ли сымитировать это? Можно попробовать“натравить” систему на свое приложение, запуская кучу других приложений, съедающих знатный кусок памяти, а затем надеяться, что система таки снизошла до нас убив нужное приложение. Прямо какой-то шаманизм получается, а это стезя админов, но никак не программистов. Меня заинтересовало, как можно легко и быстро убить приложение, да так, будто это сделала система для освобождения ресурсов. Ведь если получится повторить подобное поведение в “лабораторных условиях”, можно будет отлавливать множество ошибок ещё на стадии разработки, либо с лёгкостью воспроизвести их для выявления причин.
Как оказалось, нужный механизм уже имеется в SDK, и это… барабанная дробь… Кнопка «Terminate Application».
Нажатие на нее аналогично выполнению следующего кода:
Это, собственно, и убивает процесс. Похожее действие происходит когда система пытается избавиться от ненужного процесса.
Для того, чтобы воспроизвести ситуацию с возобновлением работы приложения после его полной остановки, нужно проделать следующую последовательность действий:
- Используя Android Stidio запустить приложение;
- Свернуть приложение нажатием кнопки «Home»;
- В Android Studio, перейти на вкладку Android, выбрать приложение и нажать кнопку «Terminate Application»;
- Развернуть свернутое приложение.
Если Activity не совсем корректно обрабатывает восстановление после уничтожения, вы сразу это заметите. В лучшем случае оно упадёт, в худшем зависнет.
Итак, мы научились выманивать один из самых скрытных типов ошибок. Давайте научимся эти ошибки предвидеть. Начнем с самых очевидных случаев, а затем плавно перейдем к менее однозначным случаям.
Ситуация 1: Статик — это не надёжно
Как видно из кода, в первой Activity разработчик решил не “заморачиваться” и поместил данные в статические переменные. Это весьма соблазнительно, когда нужно передать достаточно неординарный объект, не поддающийся простой сериализации. Над второй Activity он тоже не долго думал и не сделал проверки на нул. Зачем, когда первая Activity всё уже сделала?
Проделываем описанную ранее последовательность по корректному уничтожению процесса на второй Activity. Приложение падает.
Что случилось?
Проблема тут не в отсутствии проверки на null. Самая страшная проблема — это потеря пользовательских данных. Статические объекты не должны быть хранилищем данных, особенно если это их единственное место. Касается это как обычных переменных так и синглтонов. Так что если в статике хранится что-то важное, будьте готовы это важное потерять в любой момент.
Что делать?
Наличие таких ошибок, зачастую, свидетельствует о низкой квалификации программиста, либо о слишком высоком чувстве лени. О том как делать правильно, написано огромное количество туториалов. В приведенном примере лучше всего подойдёт передача данных через бандл. Также можно писать эти данные в SharedPreferences, либо стоит задуматься о создании базы данных.
Важно: Не стоит забывать, что синглтон это тоже статик переменная. Если вы используете синглтон, то он должен выступать лишь как инструмент облегчающий доступ к данным, но ни как не быть единственным хранилищем для них.
Волшебная сила Application
Как часто я вижу советы использовать класс Application как синглтон либо инициализировать синглтон в методе onCreate() класса Application. Якобы после этого он станет круче чем Ленин, то есть будет живее всех живых при любых обстоятельствах. Возможно, это частный случай заблуждения встретившийся только мне. Причем, все публикации которые я находил, явно не заявляют о подобных свойствах синглтона. В некоторых из них говорится, что синглтон может быть уничтожен сборщиком мусора если инициировать его в классе Activity (что для меня звучит немного дико). В других пугают выгрузкой класса из класслоадера (а это уже похоже на правду).
Сейчас я не собираюсь выяснять, что тут правда а что домыслы. В любом случае это лишь снижает вероятность потери статик ссылки но ни как не спасает от остановки процесса. Остановка процесса приведет к полному уничтожению класслоадера, а вместе с ним и уничтожению всех классов, включая класс Application.
Ситуация 2: setRetainInstance как решение всех проблем
Такая реализация — стойка к любым вращениям экрана. Все будет работать как часы. До поры до времени…
Применим последовательность действий для хитрого уничтожения процесса, когда диалог открыт. При разворачивании ничего не произойдет. Однако, при вызове invokePersonChoose приложение вылетит с NullPointerException.
Что случилось?
setRetainInstance(true) не позволяло диалогу уничтожиться. После уничтожения процесса диалог все-таки был уничтожен. Activity восстанавливает фрагмент насколько это возможно. К сожалению, слушатель не восстанавливается, так как он был установлен совершенно в другом месте для совершенно другого объекта. Когда в диалоге, в методе invokePersonChoose, происходит обращение к слушателю, выбрасывается исключение. И беда тут не в отсутствии проверки на null. Поставить проверку на null без должной реакции на пустую ссылку будет еще более худшим решением.
Что делать?
В интернете описана куча способов передачи сообщений из фрагмента в Activity. К сожалению, не все из них правильные. Следующий способ правильный и один из моих любимых:
- Activity реализует нужный интерфейс:
Единственное, что не стоит забывать, Activity может быть уже уничтожена когда дело дойдет до отправки сообщения. Поэтому обязательно проверьте добавлен ли фрагмент на Activity.
По мимо Activity можно использовать родительский фрагмент или Target фрагмент.
Еще пара слов про setRetainInstance
Замечу, это лишь частный случай с setRetainInstance. Количество проблем которые он может скрыть(а не решить) немного больше. Вместе со слушателями также теряются и все остальные переменные. Все, что не было сохранено в методе onSaveInstanceState, будет потеряно.
Также, он скрывает проблему когда класс диалога анонимный. Допустим, в момент создания нового объекта диалога, переопределен какой либо метод, в этом случае создастся объект анонимного класса.
Если этот диалог будет уничтожен и система попытается его восстановить выбросится исключение ClassNotFoundException.
Ситуация 3: Разорванные нити
Если запустить этот код и не дожидаясь его завершения свернуть приложение, а затем вырубить процесс, то при разворачивании ничего не предвещает беды, приложение не падает, а диалог показывается. Ждём немножко… Ещё ждём… Потом ещё ждём… Диалог не закрывается, хоть и должен был сделать это уже давно.
Что случилось?
При уничтожении процесса останавливаются все его потоки, а при восстановлении запускается только главный поток. Так что если ваш поток работает слишком долго, будьте готовы к тому, что он будет остановлен. Причём не обязательно делать что-то долго, на эти грабли можно наступить и при использовании wait notify. Особенно забавно будет, если в качестве объекта для блокировки использовать public static final Object, ведь мы то уже знаем, что статик объекты не исключение при уничтожении процесса.
Что делать?
Если задача занимает много времени вынести ее в отдельный сервис и запустить в новом процессе, плюс вывести foreground Notification, иначе процесс все равно будет убит. В случае с wait notify все немного сложнее и зависит от конкретной ситуации. Вообще, тема работы с потоками достаточно обширна, и давать какой-то конкретный совет тут неуместно. Разве что не усложнять и не лезть в дебри, из которых не сможешь вылезти.
Ситуация 4: Письмо в никуда
Для того чтобы первая Activity не уничтожалась при поворотах экрана, в файл манифеста добавлены configChanges.
Во второй Activity есть кнопка, нажатие по которой шлет сообщение для смены цвета.
При возвращении на первую Activity цвет View будет изменен.
Однако, если перейти на вторую Activity, свернуть приложение, убить процесс, а затем развернуть приложение, случится кое-что не предвиденное. Сколько бы раз вы не нажимали на кнопку смены цвета, при возвращении на первую Activity ее View будет белоснежной.
Что случилось?
Не смотря на то, что стек активностей сохранился, после разворачивания приложения была восстановлена только вторая Activity. Фактически, сообщения о смене цвета уходили в никуда. Так как на тот момент не существовало объектов, подписанных на это событие. При возвращении на первую Activity она была восстановлена, но подписываться на событие смены цвета было уже поздно.
Что делать?
Первым делом нужно уяснить главное — если вы работаете с одной Activity, остальные для нее не существуют. Если нужно донести какую либо информацию, используйте предназначенный для этого setResult. Еще не следует слепо полагаться на жизненные циклы. Как видно из примера, если Activity 1 запустила Activity 2 то это еще не значит, что метод onCreate первой Activity был выполнен.
Также замечу, этот пример показывает не только на проблемы со стеком активностей, но и проблемы со всем, что связано с посылкой сообщений. Исключением будут только BroadcastReceiver-ы, прописанные в манифесте, либо запланированные через AlarmManager. Все остальное не дает 100% гарантии на доставку сообщения адресату.
Заключение
“Бывалым кодерам” эти ситуации могут показаться очевидными, а примеры на столько не естественными, что просто воротит. Однако, все мы когда-то начинали с нуля и писали код от которого сейчас было бы стыдно. Знай я об этих граблях в самом начале своего пути, шишек на лбу было бы меньше. Надеюсь, эта статья поможет наставить на путь истинный большое количество начинающих Android программистов. От “Бывалых” буду рад увидеть комментарии. А еще лучше если вы дополните список или напишете, помогла ли эта статья в ловле багов из разряда “Как?! Такого не может быть!”.
На этом закончу. Спасибо за внимание. Напоследок замечу, в рукаве у меня еще остался один неординарный случай. Он еще не изучен мной до конца, но я надеюсь в скором времени расколоть этот крепкий орешек. Так что ждите продолжения.
Источник