Intereting Posts
Настроить текст кнопки на вопросительный знак Как отключить отладочные сообщения Android MediaPlayer Менеджер SDK не смог установить каталог блокировки «java.exe» DrawerLayout поверх панели действий Бесконечное скопление ионным каркасом Android: закрытие приложения, как только оно открывается Будет ли токен FCM периодически изменяться, как идентификатор регистрации GCM? Используя флажок для фильтрации контактов и получения номера телефона Что такое GPS, AGPS, LBS в Android? Java.io.IOException: Ошибка при выполнении exec (). Команды: Рабочий каталог: null Окружающая среда: null Android Button vs TextView – поведение, связанное с гиперссылкой Есть ли замена testflight для Android Загрузка / переопределение пользовательских классов для Android-классов Eclipse не создает файлы в новом проекте Android Как зарегистрировать собственный файл намерения для трансляции приемника в файле манифеста?

Использование ResultReceiver в Android

В принципе, я хотел бы установить обратный вызов для Activity из IntentService. Мой вопрос очень похож на тот, который здесь ответил:

Служба Restful API

Однако в коде ответа код активности рассматривается как реализация ResultReceiver. Если я что-то не хватает, ResultReceiver на самом деле является классом, поэтому он не может выполнить эту реализацию.

По сути, я спрашиваю, каким будет правильный способ подключить ResultReceiver к этой службе. Я смущен понятиями Handler и ResultReceiver относительно этого. Любой рабочий примерный код будет оценен.

  1. Вам необходимо создать пользовательский класс resultreceiver, расширенный из ResultReceiver

  2. Затем реализует интерфейс resultreceiver в вашей деятельности

  3. Передайте пользовательский объект resultreceiver для намеренияService и в intenservice просто извлеките объект-получатель и вызовите функцию receiver.send () для отправки чего-либо вызывающей активности в объект Bundle.

    Здесь customResultReceiver класс:

    public class MyResultReceiver extends ResultReceiver { private Receiver mReceiver; public MyResultReceiver(Handler handler) { super(handler); // TODO Auto-generated constructor stub } public interface Receiver { public void onReceiveResult(int resultCode, Bundle resultData); } public void setReceiver(Receiver receiver) { mReceiver = receiver; } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (mReceiver != null) { mReceiver.onReceiveResult(resultCode, resultData); } } } 

Реализует интерфейс Myresultreceiver.receiver в вашей деятельности, создает переменную класса

 Public MyResultReceiver mReceiver; 

Инициализировать эту переменную в onCreate:

 mReceiver = new MyResultReceiver(new Handler()); mReceiver.setReceiver(this); 

Передайте этот mReceiver в намерение службы через:

 intent.putExtra("receiverTag", mReceiver); 

И выберите в IntentService, как:

 ResultReceiver rec = intent.getParcelableExtra("receiverTag"); 

И отправлять что-либо в действие с помощью rec как:

 Bundle b=new Bundle(); rec.send(0, b); 

Это будет получено в onReceiveResult активности. Вы можете просмотреть полный код по адресу: IntentService: предоставление данных обратно в Activity

Изменить: вы должны вызвать setReceiver (this) в onResume и setReceiver (null) в onPause (), чтобы избежать утечек.

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

Например:

 intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (resultCode == StockService.RESULT_ID_QUOTE) { ... } } }); 

Я создал простой пример, демонстрирующий, как использовать ResultReceiver .

MainActivity :

 public class MainActivity extends AppCompatActivity { private final static String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent serviceIntent = new Intent(this, MyService.class); serviceIntent.putExtra("logName", "MAIN_ACTIVITY"); serviceIntent.putExtra(MyService.BUNDLED_LISTENER, new ResultReceiver(new Handler()) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); if (resultCode == Activity.RESULT_OK) { String val = resultData.getString("value"); Log.i(TAG, "++++++++++++RESULT_OK+++++++++++ [" + val + "]"); } else { Log.i(TAG, "+++++++++++++RESULT_NOT_OK++++++++++++"); } } }); startService(serviceIntent); } } 

MyService :

 public class MyService extends Service { private final static String TAG = MyService.class.getSimpleName(); public final static String BUNDLED_LISTENER = "listener"; @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { String logName = intent.getStringExtra("logName"); ResultReceiver receiver = intent.getParcelableExtra(MyService.BUNDLED_LISTENER); Bundle bundle = new Bundle(); bundle.putString("value", "30"); receiver.send(Activity.RESULT_OK, bundle); return Service.START_NOT_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } 

Для использования Resulteceiver в android

  1. Создать SomeResultReceiver распространяется от resultReceiver

  2. Создать интерфейс someReceiver с помощью метода on, например onReceivResult (int resultCode, Bundle resultData);

3.use someReceiver в someResultreceiver

  1. Create someService расширяет IntentService и использует метод someresultReceiver.send () для отправки результата из сервиса в некоторый один класс (например: MyActivity)

  2. Внедрить somereceiver на активность

6.instantiation someResultReceiver в классе MyActivity и setreceiver

  1. StartService с Intent и putExtra someResultreceiver instanse

Для получения дополнительной информации. Класс ResultReceiver см. В описании ссылки здесь.