Почему приложение иногда перезапускает killProcess?

Обычно, выходя из приложения, вызывая:

android.os.Process.killProcess(android.os.Process.myPid());

хорошо работает без инцидентов.

Но время от времени приложение снова перезагружается (после выхода!).

Соответствующий отрывок из журнала показывает:

.631: I/Process(15495): Sending signal. PID: 15495 SIG: 9
.641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18
.651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died.
.651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false}
.661: I/AudioService(164):  AudioFocus  abandonAudioFocus() from [email protected]
.701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003}

Я знаю, что по дизайну ОС Android killProcess() не является надлежащим способом для завершения работы приложения. Это связано с тем, что killProcess() немедленно останавливает процесс , не давая никаких шансов или шансов для приложения, чтобы предотвратить его или подготовиться к нему.

Я знаю, что когда я вызываю finish(), стек приложения просто выталкивается на задний план (и все еще существует в памяти), Сам Android решает, когда закрыть приложение (т.е. Удалить его экземпляр из памяти), и обычно это делается, когда приложение становится "самым старым, которое не используется в течение самого длительного времени". Его поведение на самом деле более предсказуемо, если оно действительно последнее.

Проблема заключается в том, что finish() останавливается и уничтожает активность, для которой он был вызван. Это не останавливает другие действия, порожденные приложением или другими действиями. Таким образом, для удобства тестирования и отладки во время разработки я использую killProcess() как удобный ярлык.

Но теперь я вижу, что это имеет побочный эффект приложения, который иногда перезапускается сразу после убийства - все в течение 30 миллисекунд.

Простое решение состоит в том, чтобы выполнить итерацию всех приложений и finish() их. Но прежде чем приступать к этому, я умираю, чтобы понять , что в ОС Android заставляет приложение воскресить себя.

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

И почему непоследовательно? (т.е. иногда)

Ответ 1

Существует известная ошибка в том, как приложения запускаются впервые с установщика, веб-браузера и через IDE (IntelliJ, Eclipse и т.д.). Попробуйте установить приложение без его запуска, а затем запустите его из списка доступных приложений и проверьте, не исчезла ли проблема. См. Эти проблемы, давно связанные с проблемой:

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=26658

Ответ 2

Работает ли ваше приложение в одном процессе или несколько? killProcess убьет один процесс, а не все ваше приложение. Вместо этого используйте ActivityManager#killBackgroundProcesses(String packageName).

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

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

Ответ 3

Из ADT 17.0.0 существует статическое поле BuildConfig.DEBUG, которое поможет вам при отладке. Например, вы можете иметь статический класс, который содержит все экземпляры запущенных действий. Тогда вы можете закончить их все за раз. Я думаю, что это лучше, чем killProcess()...