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

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

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

Служба Restful API

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

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

4b9b3361

Ответ 1

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

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

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

    здесь пользовательский классResultReceiver:

     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: возврат данных к активности

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

Ответ 2

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

Например:

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

Ответ 3

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

}

Ответ 5

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

  • Create SomeResultReceiver продолжается от resultReceiver

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

3.use someReceiver в someResultreceiver

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

  2. Внедрить somereceiver on Activity

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

  1. startService с Intent и putExtra someResultreceiver instanse

Подробнее о классе ResultReceiver см. введите ссылку здесь