Я понимаю, что IntentServices работает в фоновом режиме, а регулярная служба будет работать в основном потоке.
Объекты не работают по темам. Способы делают.
IntentService
унаследовал от Service
. Основные методы жизненного цикла на Service
, в частности onStartCommand()
, вызываются в основной прикладной нити. IntentService
помогает создать фоновый поток, который используется для вызова метода onHandleIntent()
, вызванного вызовом onStartCommand()
.
Для чего-то без UI, который просто обновляет данные, зачем вы хотите, чтобы он запускался в основном потоке?
У вас нет.
Почему в приведенном ниже примере службы SyncService используется Служба вместо IntentService?
Потому что IntentService
здесь неуместно. Составляя ссылку, связанную с:
Для этого вам необходимо создать связанный сервис, который передает специальный объект привязки Android из компонента адаптера синхронизации в фреймворк. С помощью этого объекта связующего фреймворк может вызывать метод onPerformSync() и передавать ему данные.
IntentService
и шаблон привязки не работают вместе.
С точки зрения резьбы onPerformSync()
is called on a background thread, поставляемый компанией Android. Следовательно, даже если IntentService
не были исключены из-за привязки, вам не нужен другой фоновый поток, так как onPerformSync()
уже вызывается в фоновом потоке.
Спасибо. Я думаю, что моя проблема в том, что я создаю LocationListener в методе onCreate() моей службы (чтобы получить текущее местоположение пользователя), поэтому, когда вызывается onPerformSync() SyncAdapter, он использует обновленное местоположение. У вас есть лучшая идея относительно того, где я должен создать свой LocationListener (он использует сетевого провайдера и только получает текущее местоположение пользователя один раз). – ZakTaccardi
@ user891242: IMHO, получение местоположения пользователя не имеет ничего общего с синхронизацией с сервером (точка «SyncAdapter»). – CommonsWare
Ну, в моем приложении погоды у меня есть опция CheckboxPreference, которая позволяет пользователю использовать свое текущее местоположение для данных о погоде. Когда я поставлю флажок, я хочу, чтобы SyncAdapter синхронизировался немедленно, используя новое местоположение. Основываясь на ваших советах, я асинхронно получаю новое местоположение с помощью IntentService, а затем вызываю службу SyncAdapter при получении нового местоположения. – ZakTaccardi