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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Обновлено: После тестирования 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();
}

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

Ответ 3

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

  • onCreate()
  • onRestart()
  • onStart()
  • onResume()
  • OnPause()

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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