Не одобряется ли выход из приложения? - PullRequest
1108 голосов
/ 09 января 2010

Продолжая попытки освоить Android, я просто прочитал следующее :

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

Ответ: (Romain Guy): Пользователь этого не делает, система обрабатывает это автоматически. Вот для чего нужен жизненный цикл активности (особенно onPause / onStop / onDestroy). Что бы вы ни делали, не ставьте кнопку «выйти» или «выйти» из приложения. Это бесполезно с моделью приложения Android. Это также противоречит принципам работы основных приложений.

Хе-хе, за каждый мой шаг в мире Android я сталкиваюсь с какой-то проблемой = (

По-видимому, вы не можете закрыть приложение в Android (но система Android может очень хорошо полностью уничтожить ваше приложение, когда оно будет похоже). Что с этим? Я начинаю думать, что невозможно написать приложение, которое функционирует как «обычное приложение» - что пользователь может выйти из приложения, когда он / она решит это сделать. Это не то, на что должна полагаться ОС.

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

Я действительно с нетерпением ждал разработки для платформы Android, поскольку она решает множество проблем, существующих в Windows Mobile и .NET. Тем не менее, последняя неделя была для меня своего рода поворотом ... Надеюсь, мне не придется отказываться от Android, но сейчас это выглядит не очень хорошо = (

Есть ли способ для действительно выйти из приложения?

Ответы [ 38 ]

19 голосов
/ 05 августа 2010

Если вы не можете понять, как сделать ваши данные / подключения (и, следовательно, ваше «приложение») постоянными, то вы не сможете делать то, что вам «нужно», чтобы делать с Android.

Те, кто скачивает эти милые маленькие App Killers, обычно обнаруживают, что они не помогают времени автономной работы или использованию памяти, но мешают ОС эффективно управлять памятью ...

http://android -developers.blogspot.com / 2010/04 / многозадачности-андроида-way.html

19 голосов
/ 09 января 2010

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

Например, Google Listen продолжает воспроизводить подкаст, когда приложение не отображается. Но всегда есть кнопка паузы, чтобы выключить подкаст, когда пользователь закончил с ним. Если я правильно помню, «Прослушивание» даже помещает ярлык в панель уведомлений, чтобы вы всегда могли быстро добраться до кнопки паузы. Другим примером является приложение, например, приложение для Twitter, которое постоянно опрашивает службу в Интернете. Эти типы приложений действительно должны позволять пользователю выбирать, как часто опрашивать сервер или даже опрашивать в фоновом потоке.

Если вам нужен код, который запускается при выходе, вы можете переопределить onPause (), onStop () или onDestroy () в зависимости от ситуации. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

18 голосов
/ 14 января 2010

Я хотел бы прочитать "Разработка беспроводных приложений для Android" , опубликованную Addison-Wesley. Я только заканчиваю это, и это ОЧЕНЬ тщательно.

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

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

Кстати, я никак не связан с Addison-Wesley или с каким-либо лицом или организацией, связанной с этой книгой. Перечитав мой пост, я чувствую, что немного оторвался от фанатов. Мне просто очень понравилось, и я нашел это чрезвычайно полезным. :)

15 голосов
/ 19 мая 2012

Почти в 99% случаев нет необходимости, чтобы приложение Android брало свой жизненный цикл. В большинстве случаев все сводится к лучшему планированию или более разумному дизайну приложения. Например, лучше создать внутреннюю службу (не экспортированную) для обработки загрузок и т. Д., Либо разрабатывать действия и задачи, связанные с рабочим процессом пользователя.

Но, как говорится, там, где есть воля, есть путь. Android предоставляет - через класс android.os.Process - намного лучший API, чем Java, для управления базовым процессом. И в отличие от Java, он не рассматривает разработчика как придурка, скрывая все это за простым вызовом java.lang.System.exit ().

Так как же попросить ваше приложение совершить самоубийство в Android? Ну, трюк прост:

Создайте свой собственный класс приложений Android, унаследовав его от стандартного класса android.app.Application (не забудьте объявить его в файле AndroidManifest.xml).

Переопределите метод onCreate () и сохраните идентификатор процесса, который запустил ваше приложение:

this.pid = android.os.Process.myPid(); // Save for later use.

Теперь, чтобы убить ваше приложение, предоставьте метод kill ():

android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);

Теперь, когда вам нужно, чтобы ваше приложение совершило самоубийство, просто наберите контекст приложения и вызовите свой метод kill!

((MySuicidalApp) context.getApplicationContext()).kill()

Просто помните, что из-за политик управления процессами в Android, в частности связанных со службами, Android может просто перезапустить службу (см. . На Android не следует использовать средства блокировки задач ).

14 голосов
/ 06 марта 2012

Когда я создаю приложение в Android, я вижу это так:

  • Вы работаете со своим приложением
  • Телефон зазвонил
  • Вы принимаете звонок
  • В конце разговора вы возвращаетесь к своей заявке в том же месте, где вы были

Для этого вам понадобятся только кнопка Назад или кнопка Домой вашего телефона (при коротком или длительном нажатии) и панель уведомлений.

При выходе из приложения я использую только кнопку Назад , пока не выйду из нее, или кнопку Home .

Я так думаю, что большинство приложений задумано. Но если мне нужен какой-то сеанс или соединение, я дал понять пользователю с помощью кнопки входа / выхода и уведомления (строка заголовка или что-то еще). Это довольно другой стиль, нежели стиль приложения «выход».

На ПК у вас рабочий стол с несколькими графическими интерфейсами, а на Android у вас очевидно многозадачность, но вы отображаете только одно приложение за раз (я не рассматриваю виджеты здесь ^^). А на мобильном телефоне в любое время вы можете получить уведомление о чем-то более важном, чем то, что вы делаете.

Таким образом, вся концепция приложения основывается на чем-то ином, чем "вход в приложение - работа - выход из приложения".

12 голосов
/ 07 февраля 2010

Хмм ...

Я думаю, что вы просто не видите приложение для Android правильно. Вы можете легко сделать что-то почти то, что хотите:

  • Сохраните ли действия приложения в состоянии сохранения / восстановления так, как это рекомендуется в документации по жизненному циклу разработчика.

  • Если на этапе восстановления требуется какой-либо вход в систему (информация о входе / сеансе отсутствует), то сделайте это.

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

Таким образом, вам все равно, действительно ли приложение действительно удалено из памяти.

Если вы действительно хотите удалить его из памяти (это не рекомендуется, и, кстати, с какой целью?), Вы можете уничтожить его условно в конце onDestroy() с помощью java.lang.System.exit(0) (или, возможно, restartPackage(..)?). Конечно, делайте это только в том случае, если вы хотите «действительно завершить приложение», поскольку onDestroy() является частью обычного жизненного цикла действий, а не завершением приложения вообще.

11 голосов
/ 09 января 2010

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

10 голосов
/ 13 июля 2010

Я согласен с Тедом. Я понимаю, что выход из приложения не «Android way», но, похоже, это не следует исключать. Вот три причины, по которым вам может потребоваться реальный выход в приложение (не только активность):

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

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

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

10 голосов
/ 20 мая 2011

В ядре Linux есть функция под названием Убийца нехватки памяти (как упоминалось выше, политики настраиваются на уровне пользовательского пространства, а ядро ​​не является оптимальным, но никоим образом нет необходимости).

И он активно используется Android:

Некоторые приложения пользовательского пространства могут помочь с этими приложениями уничтожения, например:

9 голосов
/ 12 марта 2012

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

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

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

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

Лично я бы не стал использовать этот подход, поскольку пользователи Android ожидают, что приложение сохранит свою непрерывность при повторном посещении, и поэтому они не привыкли к модальности «выхода» из приложения. Вместо этого я бы поддерживал «чистую» функцию, которую пользователь может вызывать для сброса приложения до некоторого начального состояния по умолчанию, без необходимости «оставлять» его в процессе.

Единственное исключение будет, когда пользователь нажимает кнопку "Назад" достаточное количество раз, чтобы приложение закрылось. В этой ситуации пользователь не ожидает, что состояние будет сохранено (и если в приложении есть несохраненное состояние, то вы, как разработчик, должны иметь код, обрабатывающий кнопку «назад», которая обнаруживает эти несохраненные данные, и предлагает пользователю сохранить его в SharedPreferences или в файл, или на другой энергонезависимый носитель).

Относительно system.exit (0):

Если вы решите использовать system.exit (0), чтобы закрыть приложение с грубой окончательностью (например, в результате последнего нажатия кнопки «Назад»), то я бы предупредил вас, что, хотя для меня это «работает» и в некоторых случаях это был единственный способ, которым я смог закрыть приложение без каких-либо следов от него, есть один незначительный сбой, который возникает в Jelly Bean при использовании этого подхода.

В частности, если вы используете список «Недавние приложения», чтобы открыть свое приложение, а затем нажмите кнопку «Назад», чтобы закрыть приложение (с этим закрытием, реализованным с помощью system.exit (0)), список «Недавние приложения» снова станет видимым, как это никогда не будет закрыто. Если затем вы нажмете на запись вашего приложения в этом списке, чтобы запустить ее второй раз из того же, уже открытого списка недавних приложений, ответа не будет.

Я подозреваю, что причина этого в том, что в списке «Последние приложения» содержится ссылка на ваше приложение, которое перестало работать из-за того, что вы закрыли приложение с помощью system.exit (0). Более цивилизованное закрытие вашего приложения с использованием finish () могло бы информировать ОС таким образом, чтобы оно могло обновить свой список недавних приложений, но system.exit (0), по-видимому, этого не делает.

Само по себе это не является большой проблемой, так как очень немногие люди откроют приложение из Недавних приложений, затем закроют его, а затем сразу же откроют снова из того же открытого списка Недавних приложений. И если они нажмут кнопку «Домой», а затем заново откроют список последних приложений, запись вашего приложения будет там, и она будет полностью функциональной. Но Я думаю, что это показывает, что использование system.exit (0) может помешать правильной связи между вашим приложением и ОС, и это говорит о том, что могут быть и другие, более серьезные, возможно, тонкие, последствия использования этого подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...