Почему приложение иногда перезапускает 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 android.media.AudioManager@460b2b98 .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 миллисекунд .

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

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

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

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

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

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

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

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

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

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

Следуйте по ссылке, у которой есть ожидаемый ответ на ваш вопрос. Android.os.Process.killProcess (pid) снова перезапустил процессы

Intereting Posts
Производительность Android-устройства Android Android – Как подключить WebView к активности после создания его с помощью контекста приложения Анонимный прослушиватель запроса на волейбол, вызывающий утечку памяти Проверка разрешения записи на внешнее хранилище в приложении Android Общий приемник для кнопок в макете андроида? Когда я эмулирую приложение Ionic, он бросает TypeError: невозможно вызвать метод на неопределенный Совокупный результат нескольких HTTP-запросов в один список Как показать зарегистрированный символ Ⓡ или товарного знака в диалоговом окне? Плавающий вид на экране Android Android-вызов JNI для родных C-функций убивает активность Android-интерфейс UI Style ListView с контекстной панелью действий? Как выйти из LinkedIn, используя authrequest с помощью Android? Android ListView – различные изображения разделителей Android 6.0 Marshmallow перестает показывать Вертикальный указатель SeekBar Динамическое восстановление в Android