Подтвердить что ты не робот

Как сервис возвращает результат активности

У меня, похоже, классическая задача, но я не могу найти примеров того, как это сделать.

Я хочу что-то скачать. Ну, я звоню в веб-службу и получаю ответ... но это почти то же самое.

Для этого у меня есть активность, которая запускает службу, которая порождает поток, который выполняет задание.

Теперь я хотел бы использовать данные, которые я получил в активности, которая запустила службу.

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

Моя проблема в том, как служба уведомляет о деятельности (той, которая ее начала или другая), что-то?

Любые указатели на примеры очень ценятся.

Привет

4b9b3361

Ответ 2

В соответствии с документацией google, если ваша активность и служба находятся в одном приложении, использование LocalBroadcastManager предпочтительнее sendBroadcast (намерение), потому что отправленная информация не проходит через систему, которая устраняет риск перехвата. http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

Он довольно прост в использовании.

В своей деятельности создайте BroadcastReceiver и динамически добавьте слушатель в метод onResume():

private BroadcastReceiver  BReceiver = new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
        //put here whaterver you want your activity to do with the intent received
    }           
};

protected void onResume(){
super.onResume();
LocalBroadcastManager.getInstance(this).registerReceiver(bReceiver, new IntentFilter("message"));
}

protected void onPause (){
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver);
}

И в вашем сервисе вы получаете экземпляр LocalBroadcastManager и используете его для отправки намерения. Обычно я помещаю его в свой собственный метод:

private void sendBroadcast (boolean success){
    Intent intent = new Intent ("message"); //put the same message as in the filter you used in the activity when registering the receiver
    intent.putExtra("success", success);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

Ответ 3

Если вам нужно вернуть различные типы данных, например пользовательский класс, вы можете попробовать bindService и обратный вызов. Это может привести к невозможности реализации более простого интерфейса, чем sendBroadcast.

Пожалуйста, посмотрите пример в моем сообщении:

fooobar.com/info/7752/...

И еще, если вы используете IntentService, вы можете посмотреть ResultReceiver. Детали и образец можно найти в этом сообщении:

Android: сервис обслуживания клиентов

Надеюсь, что это поможет.