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

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

Служба Restful API

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

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

Solutions Collecting From Web of "Использование ResultReceiver в Android"

  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 см. В описании ссылки здесь.