Подтвердить что ты не робот

Почему называть Process.killProcess(Process.myPid()) плохой идеей?

Я прочитал несколько постов, в которых говорится, что использование этого метода "не хорошо", его не следует использовать, это не правильный способ "закрыть" приложение, а не то, как работает Android...

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

Что я знаю, так это то, что вызов этого метода, когда другие потоки выполняют потенциально важную работу (операции с файлами, запись в БД, HTTP-запросы, запуск служб...), приводит к тому, что потоки завершаются, и это явно не хорошо. Кроме того, я знаю, что могу извлечь выгоду из того факта, что "повторное открытие" приложения будет происходить быстрее, поскольку система все еще "держит" состояние памяти с момента последнего использования приложения, а killProcess() предотвращает это.

Помимо этой причины, если у меня нет таких операций и мне все равно, будет ли мое приложение запускаться с нуля при каждом его открытии, есть ли другие причины, по которым мне не следует использовать метод killProcess()?

Я знаю о методе finish() чтобы закрыть Activity, поэтому, пожалуйста, не включайте это в свой ответ.

finish() предназначена только для Activity, а не для всех приложений, и я думаю, что точно знаю, почему и когда ее использовать.

И еще - я занимаюсь разработкой игр на основе Unity3D и экспортирую проект в Android. Когда я декомпилировал сгенерированный apk, я был очень удивлен, обнаружив, что исходный код java создан из метода Unity - Application.quit(), реализующего единство, с Process.killProcess(Process.myPid()).

Предполагается, что Application.quit() является правильным способом закрыть игру в соответствии с документацией Unity3D (правда ли это? Может быть, я ошибаюсь и что-то упустил), так почему же разработчики платформы Unity реализовали это в нативном Android?

4b9b3361

Ответ 1

Кто сказал, что вызов Process.killProcess(Process.myPid()) - плохая идея?

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

Однако, полагая, что вы точно знаете, что не прерываете нити или другие фоновые операции, и вы используете этот вызов в onDestroy() - я не вижу причин, почему вы не должны его использовать. Особенно, когда это вызов API, а не обходной путь, и Google не упомянул об этом лучше не использовать его в документации API.

Ответ 2

<rant>

В идеальном мире, с совершенным кодом и библиотеками, вам не нужно вызывать Process.killProcess(Process.myPid()), и ОС будет корректно убивать ваше приложение. Также будет мир на Ближнем Востоке, свиньи будут летать, и проблема прекращения будет решена.

Поскольку все эти вещи еще не произошли, есть моменты, когда вам нужно выполнить такой "запрещенный" код.

Совсем недавно для Android-игры, которую я сделал, в бесплатной версии использовалась библиотека объявлений, которая бы поддерживала приложение и утечка памяти. У платной версии эта проблема отсутствовала, так как не было связанных библиотек объявлений. Мое решение состояло в том, чтобы добавить кнопку "Выход" в главном меню, которое выполнило такой код. Мои надежды состояли в том, что большинство людей нажимали эту кнопку, когда делали, и мне не нужно беспокоиться о том, что она ела память. Платная версия, которую я только что выполнил finish(), была выполнена. (Это было до того, как были доступны покупки In-app для Google, поэтому мне пришлось сделать платную и бесплатную версию, и они, возможно, исправили проблему, и я мог обновить эту игру, но это действительно не слишком хорошо, и я сомневаюсь, что любое потраченное на это время будет стоить того)

Его вроде как в начальной/средней школе говорят, что вы не можете взять квадратный корень из отрицательного числа. Затем позже в классе алгебр более высокого уровня они говорят... ну, вы можете взять квадратный корень отрицательного числа, но вы получите странные результаты, но он согласован и решает проблему.

Другими словами, не выполняйте "запрещенный" код, если вы не знаете, что делаете.

</rant>

Ответ 3

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

Возможно, есть некоторые крайние случаи, когда вы хотели бы использовать killProcess(), но обычно ОС делает это для вас в соответствии с текущей загрузкой и использованием. Не знаете, какой ответ вы ищете - вы знаете, что использование killProcess() может сломать вещи, если вы не можете оправдать его использование, не используйте его.

Ответ 4

Вот две ситуации, когда killProcess укусит вас и не будет работать по желанию:

1) Sticky Services - они будут перезагружаться автоматически, даже если вы убили процесс

2) Таймер - если запланированные потоки выполняются на таймере, они будут продолжать выполняться после уничтожения процесса

Следовательно, как вы можете видеть, бывают ситуации, когда ** killProcess * не является разумным решением для очистки вашего запущенного приложения.

Ответ 5

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