2015-04-16 3 views
1

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

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

(Android является относительно новым для меня, так что я могу просто не знать правильную терминологию для поиска.)

EDIT:

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

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

+2

Чем скорее вы перестанете думать о терминах «приложения», тем лучше будет. Приложения не запускаются и не останавливаются на Android, не больше, чем в веб-приложении. * Другие вещи * могут иметь семантику начала/остановки, которая может или не может удовлетворить ваши потребности. Процессы, например, начинаются и останавливаются. Поэтому, чтобы помочь вам, нам нужно точно знать, что вы подразумеваете под «запуском и выключением приложений». Например, если вы считаете, что нажатие на значок запуска на главном экране означает «запуск приложения», что означает «закрытие приложения»? – CommonsWare

+0

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

+0

«Вы говорите, что при запуске ОС все приложения загружаются в память и запускаются одновременно?» - нет. Однако «приложение» и «процесс» не являются синонимами для любого вероятного определения «процесса». – CommonsWare

ответ

3

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

Это разумно. Однако его сложно реализовать.

Я (возможно, ошибочно), полагая, что ОС заботится о запуске/остановке фоновых потоков при возобновлении и приостановке приложения.

У вас есть это точно в обратном направлении. Android не платит ни одного внимания ни на какие темы, которые вы сами разыгрываете, прямо или через тонкие обертки, такие как AsyncTask.

В дополнение к этой точке замешательства вы, кажется, приравниваете «переход пользователя в другое приложение» с «отключением приложения». Это может быть одно и то же в однозадачных операционных системах. Они не то же самое в Windows, OS X, Linux, Android и т. Д.

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

Одно близко приближение было бы создать и зарегистрировать пользовательский класс Application, где вы переопределять onTrimMemory(), и остановить подготовительную работу, когда вы получаете TRIM_MEMORY_UI_HIDDEN, TRIM_MEMORY_BACKGROUND, TRIM_MEMORY_MODERATE или TRIM_MEMORY_COMPLETE - в зависимости от того из тех, что вы столкнулись с первым. Если, когда кто-то из них прибывает, вы определяете, что поток потоковой передачи все еще выдающийся, закройте его.

С точки зрения запуска, вы можете использовать onCreate() на том же Application singleton. Проблема в том, что это будет вызвано любым процессом создания, которое может включать в себя сценарии, в которых у вас нет пользовательского интерфейса (например, вы отвечаете на некоторые системные трансляции, например ACTION_BOOT_COMPLETED), или, возможно, ваш процесс будет частью вашего пользовательского интерфейса которые не зависят от потоковой передачи. Если у вас нет ни одного из этих сценариев, то onCreate() в Application будет в порядке. В противном случае, начните с потоковой передачи в onCreate() любых необходимых действий.

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

+0

Спасибо за это приятное объяснение. Я знаю разницу между «переключением на другое приложение» и «отключением приложения». Я просто пытался заявить, что фоновая задача (а не процесс, извините, неправильный термин изначально) НЕ НУЖНО запускаться в случаях, когда приложение входит в фоновый режим. На самом деле я решил запустить задачу, когда приложение загружается в память и становится активным в первый раз и останавливается, когда приложение выходит из системы и выгружается из памяти. По сути, похоже, что нет особо простого способа сделать то, что я думаю. По крайней мере, не так, как я привык. –

+0

@ JordanBondo: «На самом деле, я решил запустить задачу, когда приложение загружается в память и становится активным в первый раз» - в Android есть много возможных точек входа в приложение, и поэтому многие возможные причины почему процесс может быть разветвлен для этого приложения. Уровень пользовательского интерфейса может предлагать одну или несколько точек входа, по одному на активность. И есть фон (с точки зрения пользовательского интерфейса), например, получение трансляции. Только вы знаете свои точки входа, и только вы знаете, кому из них нужна эта потоковая нить, и поэтому там, где нужно заняться, нужно начать поток. – CommonsWare

+0

@JordanBondo: «и останавливается, когда приложение выходит и выгружается из памяти» - если «приложение выходит» означает «пользователь переключился на другое приложение», ваш процесс не прекращается немедленно, и поэтому он не «выгружается» из памяти". Если OTOH, «приложение выходит» означает «процесс был завершен», тогда вам не нужно беспокоиться о прекращении потока, поскольку поток исчезает, когда процесс выполняется. Однако это может произойти через некоторое время после того, как ваш пользовательский интерфейс переместится в фоновый режим. – CommonsWare

0

Вы можете расширить класс по умолчанию Application и реализовать его метод onCreate() для обнаружения при запуске приложения. Не существует соответствующего метода, когда приложение закрывается.

Не забудьте указать его в файле манифеста.

+1

Слишком сложно. Просто запустите программу запуска в onCreate. У вас нет причин использовать класс Application, вы должны более или менее забыть его существование. –

+0

Я использую его все время и нахожу его очень удобным. – Ridcully

+0

Это звучит так, как мне нужно. Я не критичен, что фактически останавливаю процесс, когда приложение выгружается из памяти, так как нет ничего, что нужно очистить до выхода из процесса. –

0

В Android приложение не отключается, если система не работает на памяти. Вы не получите предупреждение об этом, оно просто вызовет метод жизненного цикла onDestroy вашего сервиса. Если вы хотите сделать это, когда активность видна на экране, используйте onStart и onStop. Если вы хотите сделать это, когда активность находится в памяти, используйте onCreate и onDestroy.

+2

«он просто вызовет метод жизненного цикла onDestroy вашего сервиса» - необязательно. Все методы 'onDestroy()' являются необязательными, поскольку Android может завершить процесс, не вызывая их. Обычно 'onDestroy()' будет вызываться, но не всегда. – CommonsWare

0

Это зависит от того, что вы хотите сделать точно. Когда вас просто интересует приложение, начинающееся с первого раза, вы можете @Override onCreate().

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

Ниже приведен обзор для жизненного цикла actiity, который должен помочь вам: activity life cycle

+0

Это для любого конкретного вида деятельности. Я хорошо знаю жизненный цикл для деятельности (как я сказал в своем вопросе). Запуск чего-то в onCreate или onStart и остановка его в onStop или onDestroy в действии не представляется достаточным, так как есть ситуации, когда активность может начинаться или останавливаться более одного раза. Фактически, новый экземпляр действия может начинаться до того, как старый будет уничтожен, что приведет к одновременному одновременному запуску двух фоновых процессов, что было бы плохо. –

Смежные вопросы