Использование ResultReceiver в Android
В принципе, я хотел бы установить обратный вызов для Activity из IntentService. Мой вопрос очень похож на тот, который здесь ответил:
Служба Restful API
Однако в коде ответа код активности рассматривается как реализация ResultReceiver. Если я что-то не хватает, ResultReceiver на самом деле является классом, поэтому он не может выполнить эту реализацию.
Итак, по сути, я спрашиваю, что будет правильным способом подключить ResultReceiver к этой службе. Я смущаюсь с понятиями Handler и ResultReceiver относительно этого. Любой рабочий пример кода будет оценен.
Ответы
Ответ 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;
}
}
Ответ 4
Я бы сделал это с EventBus в настоящее время
https://github.com/google/guava/wiki/EventBusExplained
Ответ 5
для использования Resulteceiver в android
-
Create SomeResultReceiver продолжается от resultReceiver
-
Создайте интерфейс someReceiver с помощью метода on, например onReceivResult (int resultCode, Bundle resultData);
3.use someReceiver в someResultreceiver
-
создать someService расширяет IntentService и использовать метод someresultReceiver.send() для отправки результата от службы к некоторому классу (например: MyActivity)
-
Внедрить somereceiver on Activity
6.instantiation someResultReceiver в классе MyActivity и setreceiver
- startService с Intent и putExtra someResultreceiver instanse
Подробнее о классе ResultReceiver см. введите ссылку здесь