Коли користуватися ниткою/службою в Android?

Коли потрібно використовувати нитку або службу?

Чи повинні вони бути використані для автентифікації? Наприклад, у своєму додатку я розглядав можливість використання нитки або служби (я автентифікація через Active Directory).

У вас є приклади, коли кожен буде використовуватися?

28

6 Відповіді

Update: It seems the Android documentation includes a corresponding clarification now, see http://developer.android.com/reference/android/app/Service.html#WhatIsAService.

Оригінальна відповідь:

У Android, Service не забезпечує одночасне виконання ("run in background"). Насправді це більше простого об'єкта Java, який просто інвенціонує (і управляється) через систему Android замість вашої програми за допомогою new .

Тому найважливішою властивістю послуги є не відкладання робочого навантаження; це можна досягти за допомогою простих потоків.

Те, що робить спеціальний об'єкт сервісу, полягає в тому, що він зареєстрований системою Android як служба . Це дозволить системі знати, що цей об'єкт забезпечує якийсь сервіс і повинен зберігатися живим як можна довше або доки не буде зупинено. Теми звичайної програми не мають такого особливого значення для системи Android і будуть припинені набагато щедріше на розсуд системи.

Отже, якщо вам потрібні деякі фонові заходи, щоб продовжити лише тоді, коли ваша програма/ Діяльність активна, гілка може робити те, що вам потрібно.

Якщо вам потрібен компонент, який залишається активним не буде очищений, навіть якщо через деякий час система Android вирішить видалити ваш Activities з пам'яті, вам слід звернутися до служби , або навіть "передплановий сервіс", який вважається ще важливішим для системи та, навіть менш імовірно, буде припинено для повернення ресурсів.

Звичайно, за бажанням, об'єкт Service також може містити один або декілька екземплярів Thread , які потім можуть зберігатись, доки Service сам предмет.

Редагувати:

О, плюс: Служба, звичайно, шлях, якщо ви хочете надавати певні сервіси іншим додаткам, які можуть "зв'язуватися" лише з послугою.

45
додано
Тоді чому навіть зробити зв'язаний об'єкт, а не тільки початий об'єкт? Якщо ви кажете, що це, головним чином, для операції, яка зберігається в живих навіть після запуску діяльності, і для інших операцій ми повинні використовувати нитку, то прив'язана служба ніколи не буде використовуватися.
додано Автор Yonatan Nir, джерело
За документом вам знадобиться обмежена служба, яка буде зв'язуватися іншими програмами.
додано Автор Teng-pao Yu, джерело

Потік повинен використовуватися в тривалий процес, що блокує інтерфейс користувача від оновлення. Якщо це більше, ніж через секунду або два, можливо, ви захочете помістити його у фонову гілку та повідомити про це користувачеві діалог або спініндер чи щось. Якщо ви закриваєте потоку інтерфейсу користувача протягом більше 5 секунд, користувачеві буде запропоновано опція "вбити або почекати" на ОС.

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

25
додано
Кафка вірний. Сервіс запускається на основній течії, і тому ви повинні вивантажувати роботу в AsyncThread або щось подібне до цієї служби. Відсутність користувальницького інтерфейсу не означає, що він не є або не може або не буде запускатися в основному потоці. Ви можете зазвичай вважати це, але не завжди.
додано Автор davidcesarino, джерело
Вибачте за помилку ... Я мав на увазі AsyncTask, очевидно!
додано Автор davidcesarino, джерело
Android Послуга блокуватиме потік користувальницького інтерфейсу операційної системи не тільки ваш - " це означає, що, якщо ваша служба буде робити будь-які ресурсомісткі (наприклад, відтворення MP3) або блокування (наприклад, мережі) операції, він повинен породжувати свій власний потік, в якому, щоб зробити цю роботу «.
додано Автор Patrick Kafka, джерело
Служба не запускається на окремій гілці, тому вона заблокує інтерфейс користувача, Хм? Служба не має інтерфейсу. Який з них збирається заблокувати?
додано Автор Alex Gitelman, джерело
Я думаю, ви мали на увазі сказати, що дзвінок служби з активності блокуватиме інтерфейс активності протягом усього періоду дзвінка. Може бути, ви повинні це уточнити.
додано Автор Alex Gitelman, джерело
Я думаю, що відповідь @ JimmyB є більш точною. Ця відповідь є помилковою.
додано Автор daramasala, джерело
4
додано

Використовуйте службу, якщо вам потрібно щось, що використовується іншими програмами або переживає ваші дії в програмі. Хорошим прикладом сервісу є передача файлів, що може зайняти багато часу, і ви не бажаєте змусити користувача користуватися вашою програмою протягом цього часу. Використовуйте потоки (зазвичай через AsyncTask або подібні) в інших випадках.

Для перевірки автентичності AsyncTask виглядає як гарний вибір.

3
додано
+1 закінчився використанням AsyncTask
додано Автор Cody, джерело

Відповідно до посібника для розробників Android ( http://developer.android.com/ керівництво/компоненти/послуги.html # Основи ):

Сервіс - це просто компонент, який може працювати у фоновому режимі, навіть коли користувач не взаємодіє з вашою програмою. Таким чином, ви повинні створити послугу лише тоді, коли вам це потрібно.

Якщо вам потрібно виконувати роботу за межами основного потоку, але лише тоді, коли користувач взаємодіє з вашою програмою, то, напевно, ви, мабуть, повинні створити новий потік, а не службу. Наприклад, якщо ви хочете відтворити якусь музику, але лише під час активування вашої активності, ви можете створити потік на onCreate (), розпочати його запуск на onStart (), а потім зупинити його на onStop (). Також розгляньте можливість використання AsyncTask або HandlerThread замість традиційного класу Thread. Докладніше про потоки див. У документі Processes and Threading.

Пам'ятайте, що якщо ви користуєтесь послугою, він за замовчуванням запускається в основному потоці вашої програми, так що ви все ще повинні створювати нову нитку в службі, якщо вона виконує інтенсивні або блокування операцій.

1
додано

Я вважаю, що основна відмінність стосується системи Android. Служба є частиною інфраструктури Android, тому програма Android визнає сервіс як робочу частину програми та вважає, що служба смерті є останнім варіантом. Крім того, ви можете налаштувати пріоритет служби, щоб зробити це настільки ж важливим, як активність переднього плану. Що стосується потоків, то андроїд не визнає нитку важливою частиною, яка повинна зберігатися. Тому звичайні теми мають набагато більше шансів бути вбитими.

Наприклад, якщо у вас є активність, яка починає робочу гілку, а потім переходить до фону, оскільки іroid не визнає потоку як робочу частину, він може вважати, що додаток нічого не робить, тому що ніяка активність або служба не запускається і не вбиває весь додаток, включаючи робоча нитка.

1
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників

android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.