Intereting Posts
Как настроить прослушиватель onBackButton на активность Как включить / отключить прокрутку панели инструментов программно при использовании библиотеки поддержки дизайна Панель инструментов Android appcompat растягивается, когда searchview получает фокус Как изменить цвет вкладок навигации ActionBar? Как я могу получить файл из CamScanner или Office Lens в веб-приложении на Android? Резервное копирование Adb не работает Сгенерируйте 10 чисел и переместите первый номер до конца 10 раз. Как заблокировать / разблокировать экран с помощью режима Pattern / Password в Android? В libgdx, как мне получить вход с кнопки «Назад»? Удаление левого дополнения на Android EditText Изменить цвет границы формы во время выполнения Тестирование пользовательских представлений с помощью Robolectric Нельзя сжимать шквал с помощью proguard Установка источника данных в исходный ID в MediaPlayer Новая тема (задача) .start () VS ThreadPoolExecutor.submit (задача) в Android

Когда Android убивает приложение, можно ли остановить функцию наполовину?

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

Solutions Collecting From Web of "Когда Android убивает приложение, можно ли остановить функцию наполовину?"

ОС убивает процесс JVM со всеми «функциями» во всех потоках. На практике вы не должны предполагать, что метод является транзакцией. Вместо этого следует предположить, что он может быть прекращен в любое время и соответствующим образом оформлен.

Обновлено: после тестирования Android убьет любой поток / AsynTask, который в настоящее время работает (без вызова onPostExecute () / onCancelled ());

Если вы закрываете приложение как обычно. Ваш ui-thread останавливается, но если вы примете свой метод в Thread / AsyncTask / Service, он будет продолжать работать до тех пор, пока он не завершится.
Тем не менее, ваш Thread / AsyncTask может продолжать работать, но может или не может быть полностью функциональным, если у вас есть обратный вызов вашего экземпляра приложения или что-то делать с ui приложения. Это МОЖЕТ дать вам исключение в зависимости от того, что делается.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new Thread(new Runnable() { @Override public void run() { try { int i = 0; while (true) { i++; Thread.sleep(2000); Log.i("not dead", "not dead" + i); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } 

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

Ваше приложение может быть убито системой в любое время без выполнения другой строки исполняемого кода. Согласно документации, однако, существует несколько методов, которые не являются «убиваемыми»:

  • OnCreate ()
  • onRestart ()
  • OnStart ()
  • onResume ()
  • OnPause ()

Поскольку onDestroy () не будет вызван, конечно, более удобно использовать метод onPause () для записи любых постоянных данных в хранилище:

 protected void onPause(){ super.onPause(); if(isFinishing()){ // store data } } 

Каждое приложение для Android работает на отдельной Dalvik VM. И когда android убивает это приложение, он уничтожает этот экземпляр виртуальной машины. И не заботятся о тех потоках, которые вы используете, или о том, что они делают, вы можете легко проверить, что, создав сокет tcp-сервера, который будет блокироваться до тех пор, пока клиент не подключится, а затем не убьет приложение, ничего не произойдет, Ничего, потому что сам экземпляр VM убит.

Android может убить ваше приложение в любой момент, в любой момент. Но андроид пытается поддерживать ваше приложение, если у него достаточно ресурсов для него, или если у вас есть деятельность или услуга переднего плана.

Перед тем, как убить приложение Android, вызовет методы жизненного цикла ваших компонентов в соответствии с документацией SDK. Не все методы жизненного цикла гарантированы.

Было бы разумно, что он убил бы метод среднего исполнения. Учтите, что многие «зависания» обусловлены бесконечным контуром в цикле одного метода. Как еще ОС могла бы убить такое приложение, не убив его в середине выполнения метода?

Также рассмотрите это: даже если ОС разрешила «текущий» метод завершить выполнение перед убийством приложения, а затем убила приложение, оно будет убивать приложение в середине метода, который вызвал первый метод, который ОС Разрешено продолжать выполнение до его завершения. Хорошо, так что продолжайте это мышление до крайности. Если ОС разрешило выполнение каждой функции, которая находилась в середине выполнения, до завершения убийства приложения, то конечным результатом является то, что ОС позволяет завершить все приложение, что является именно тем, что убийство приложения должно обойти. Таким образом, ОС, убивая приложение, должна завершать его в середине «a» … acutally «many» …. функций. Каждая функция, которая находится в callstack, НЕ получает шанс закончить!

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