Пожалуйста, объясните некоторые концепции Android-сервисов

Я просто подхожу к Android Services, но у меня много сомнений. Здесь есть несколько вопросов. Перед тем, как начать, заметьте, что я прочитал эти страницы. Службы Android (официальные) Ограниченные службы (официальные) плюс сон. Теория внутренних классов на моем языке. Пожалуйста, будьте терпеливы, я все еще немного смущен.

1) Прежде всего, Сервисы отличает себя от AsyncTask главным образом потому, что он продолжает работать также, если приложение приостановлено (т.е. пользователь просматривает другое приложение); AsyncTask останавливается в этих случаях. Это нормально, или я ошибаюсь? 2) Служба работает в том же потоке активности, которая запускалась через startService (). Чтобы не влиять на действия Activity, мне нужно создать отдельный поток для этой Службы, например, реализовать интерфейс Runnable. Другим методом является создание службы, которая расширяет IntentService, которая автоматически предоставляет новый поток для службы: новый поток создается при любом вызове onHandleIntent ().

Теперь давайте посмотрим на мою конкретную проблему. Мне нужно создать Сервис, который будет использоваться многими Акциями: его задачей будет подключение к серверной БД каждые 60 секунд и проверка новостей. Если новость найдена, сообщите, что есть новые новости (если мы находимся в MainActivity) или показываем название новой новости (если мы находимся в читателе новостей). Как мне его закодировать? Я создал MainActivity, который создает экземпляр NewsService и сразу вызывает startService (). С другой стороны, у меня есть NewsService, расширяющий IntentService, который (создает новый поток при вызове onHandleIntent?) И ищет новые новости. Неплохо ли использовать IntentService? Я понял, что будет очень уродливо запускать сервис, вызывающий startService () на неопределенный срок. В начале этого упражнения я был хорошим решением, потому что он автоматически создает новый поток и упрощает реализацию службы. Но теперь у меня есть некоторые сомнения (я не знаю, есть ли новости! Как MainActivity это знает? И как получить заголовок)

Это должно быть сделано с нормальным расширением класса Thread, который делает бесконечный cicle в его методе run (), проверяя новости каждые 60 секунд и, если есть новый, читает заголовок из удаленных БД и кнопок / представлений о деятельности. Затем, если приложение будет закрыто пользователем, Служба также будет закрыта. Но проблема в том, что если i istantiate такого класса, то это будет остановлено, когда MainActivity будет приостановлено или остановлено, а другие действия (в этом случае NewsReader) не смогут получить обновление, потому что новый поток не получает новости на данный момент. Поэтому мне нужна Служба.

Надеюсь, это ясно. Как я должен правильно реализовать решение? Пожалуйста, выделите все, что неправильно в моем тексте, мне действительно нужно учиться: D

Solutions Collecting From Web of "Пожалуйста, объясните некоторые концепции Android-сервисов"

Кажется, вы все правильно поняли.

Что касается вашей конкретной проблемы, я бы рекомендовал следующее:

  • Используйте AlarmManager для планирования вашего обслуживания. Не позволяйте Service работать, когда это не нужно.

  • Используйте Broadcast Intent для новых новостей. Все Activities должны иметь внутренний BroadcastReceiver который слушает для Broadcast намерение службы и реагирует соответственно.

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

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

Если вы хотите, чтобы служба всегда работала, вы можете использовать START_STICKY в своем сервисе

  @Override public int onStartCommand(final Intent intent, final int flags, final int startId) { // Ensure the service will restart if it dies return START_STICKY; } 

И вы можете запустить службу:

 final Intent service = new Intent(); service.setComponent(new ComponentName(YourService.PACKAGE_NAME, YourService.SERVICE_FULL_NAME)); // Start the service context.startService(service); 

1) Прежде всего, Сервисы отличает себя от AsyncTask главным образом потому, что он продолжает работать также, если приложение приостановлено (т.е. пользователь просматривает другое приложение); AsyncTask останавливается в этих случаях. Это нормально, или я ошибаюсь?

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

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

2) Служба работает в том же потоке активности, которая запускалась через startService (). Чтобы не влиять на действия Activity, мне нужно создать отдельный поток для этой Службы, например, реализовать интерфейс Runnable. Другим методом является создание службы, которая расширяет IntentService, которая автоматически предоставляет новый поток для службы: новый поток создается при любом вызове onHandleIntent ().

Это неверно. Service не запускается ни в каком конкретном потоке. Методы жизненного цикла Service ( onCreate() , onStartCommand() и т. Д.) onStartCommand() в основном потоке (UI), который может быть или не быть тем же самым потоком, который называется startService() . Однако Service может (и обычно) запускать другие фоновые потоки, сколько потребуется, для выполнения необходимой работы.

IntentService – это особый вид Service который управляет одним или несколькими рабочими потоками, которые он использует для выполнения фоновой обработки. Вы отправляете «команду» в IntentService а IntentService ставит вашу команду в очередь. В какой-то момент (разные реализации в разных версиях Android ведут себя по-другому), ваша «команда» удаляется и обрабатывается в фоновом потоке. IntentService останавливается после того, как все «команды» были обработаны. IntentService часто не лучший выбор для Service из-за того, как он себя ведет.


IntentService определенно не то, что вы хотите в своем случае. Вероятно, вы должны использовать AlarmManager и установить будильник, который запускает вашу Service каждую минуту. Когда ваша Service запускается, она должна создать фоновый поток, который связывается с вашим сервером и проверяет наличие новостей. Если нет новостей, это может просто исчезнуть. Если есть новые новости, он может либо начать свою Activity чтобы информировать пользователя, либо отправить отправление, которое ваша Activity увидит (если он запущен), или он может создать Notification которое пользователь может открыть, когда он хотеть. Вам нужно выяснить, как вы хотите определить, когда приложение должно прекратить проверку сервера. Возможно, пользователь должен сказать вам, что он больше не интересуется, или, может быть, Service может признать, что приложение больше не работает (или не просмотрено более чем за X часов или что-то еще). Есть много способов сделать это, и это зависит от ваших требований.