2012-06-08 2 views
3

Если я создаю поток через AsyncTask из потока пользовательского интерфейса, этот поток убит, когда поток пользовательского интерфейса завершается?Функциональность типа Android Daemon

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

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

Вопрос в том, как я могу получить функциональность демона, созданного из приложения для Android? Мне не нужны разрешения за пределами родительского процесса нереста, и он не должен быть постоянным при перезагрузках.

Прошивки POSIX API через NDK или я совершенно не прав?

Всего провел пару дней с Android, так что я все еще пытаюсь почувствовать свой путь. Большое спасибо!

ответ

1

Нитки выполняются в процессе. Android приостанавливает (для последующего повторного использования) или убивает процесс приложения, когда он уничтожен, и принимает все потоки с ним. Таким образом, демон должен быть отключенным процессом, а не потоком. Android намеренно настроен, чтобы вы не могли начать их (хотя подпроцессы просты с Runtime.exec() и его родственниками).Я думаю, что вы можете делать то, что хотите, с помощью fork/exec() в NDK, но телефон должен быть укоренен для запуска результирующего приложения, что создает множество проблем. Не в последнюю очередь эта гарантия часто аннулируется для корневого телефона.

+0

Таким образом, демон должен быть отключенным процессом, а не потоком. Спасибо, да, это имеет смысл, дух! –

1

Если я создаю поток через AsyncTask из потока пользовательского интерфейса, этот поток убит, когда поток пользовательского интерфейса завершается?

Не автоматически и не сразу. Поток будет запущен до завершения, или пока Android не завершит процесс, в зависимости от того, что наступит раньше.

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

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

Вопрос в том, как я могу получить функциональность демона, созданного из приложения для Android?

Это зависит от того, какие черты «демона» вы пытаетесь получить, о чем вы пренебрегли описанием в своем вопросе.

POSIX API'ish нити через НДК

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

+0

Commonsware. большое спасибо. Я знал об этом неявно, но Джин ударил ноготь по голове, как только процесс будет уничтожен, основной поток и дети (в конце концов) пойдут с ним! –

0

Я должен был реализовать практически ту же функциональность: увольнять уведомления о форме фона.

Это довольно просто: запустите сервис и создайте новый поток из службы.

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

Например:

  • если ваш поток должен просто ждать, пока что-то вы можете запланировать периодическое «просыпаются» события с AlarmManager, которые будут заботиться о работе в фоновом режиме
  • или, если вам нужно синхронизировать данные в фоновом режиме с помощью back-end вы можете использовать API SyncAdapter, который также заботится о запуске в фоновом режиме.

Как CommonsWare просто предложил:

Это зависит от того, какие особенности «демон» вы пытаетесь получить, что вы пренебрегли описать свой вопрос.

+1

Это все еще предоставляет демону прихоти Android. Когда он хочет память и нет приложения, связывающего эту услугу, Android отключит ее. Вы можете сказать Android, что, по вашему мнению, услуга важна, говоря, что это Foreground, но это все еще не демон в смысле Linux/Unix. – Gene

+0

Hi Siarhei, я действительно развлекал эту идею, но предполагал, что прекращение потока обслуживания (по сути, пользовательский интерфейс) убьет процесс, поскольку это будет дочерним процессом. Джин сжато сформулировал очевидное, которое я полностью пропустил! –

+0

Я, вероятно, пропустил, что это должно быть совершенно неудобно. Если, однако, услуги имеют более высокий приоритет, чем действия, которые имеют значение. И в ряде [условий] (http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle) почти неудобны. Вы можете даже запустить службу как отдельный процесс, если хотите. – Siarhei

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