Использование ResultReceiver в Android - PullRequest
58 голосов
/ 22 декабря 2010

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

Служба Restful API

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

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

Ответы [ 5 ]

114 голосов
/ 22 апреля 2012
  1. Вам нужно сделать класс получателя получателя расширенным с ResultReceiver

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

  3. Передача пользовательского объекта resultreceiver в intentService и в intentservice просто выбирает объект-получатель и вызывает Функция receive.send () для отправки чего-либо в вызывающую активность в Связать объект.

    вот класс 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 службе intentService через:

intent.putExtra("receiverTag", mReceiver);

и получить в IntentService, например:

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

и отправьте что-нибудь в действие, используя rec как:

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

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

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

22 голосов
/ 29 декабря 2010

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

Например:

intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (resultCode == StockService.RESULT_ID_QUOTE) {
            ...
        }
    }
});
10 голосов
/ 04 февраля 2017

Я создал простой пример, который демонстрирует, как использовать 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;
    }

}
0 голосов
/ 06 сентября 2017

Я бы сделал это с EventBus в настоящее время

https://github.com/google/guava/wiki/EventBusExplained

0 голосов
/ 28 июня 2015

для использования Resulteceiver в Android

  1. Создание SomeResultReceiver расширяется от resultReceiver

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

3. использовать someReceiver в someResultreceiver

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

  2. Внедрить Somereceiver в Activity

6.установка someResultReceiver в классе MyActivity и setreceiver

  1. startService с Intent и putExtra someResultreceiver instanse

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

...