Зачем вызывать процесс.killProcess(процесс.myPid ()) - плохая идея?

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

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

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

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

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

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

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

5 ответов


кто сказал, что вызывающий процесс.killProcess(процесс.myPid ()) - плохая идея?

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

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


<rant>

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

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

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

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

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

</rant>


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

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


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

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

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

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


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