Использование ResultReceiver в Android
в принципе, я хотел бы установить обратный вызов активности от IntentService. Мой вопрос очень похож на тот, на который ответил Здесь:
Restful API service
однако в коде ответа код действия рассматривается как реализация ResultReceiver. Если я чего-то не хватает, ResultReceiver на самом деле является классом, поэтому он не может выполнить эту реализацию.
Итак, по существу, я спрашиваю, каков был бы правильный способ подключения ResultReceiver к этой службе. Я путаюсь с понятиями обработчика и ResultReceiver в отношении этого. Любой рабочий пример кода будет оценен по достоинству.
5 ответов:
вам нужно сделать пользовательский класс resultreceiver расширенным из ResultReceiver
затем реализует интерфейс resultreceiver в вашей деятельности
передать пользовательский объект resultreceiver в intentService и in intentservice просто извлекает объект 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.интерфейс приемника в вашей деятельности, создайте переменную класса
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: предоставление данных обратно в Activity
Edit: вы должны вызвать 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
создать SomeResultReceiver простирается от resultReceiver
создать интерфейс someReceiver с методом on например onReceivResult(int resultCode, Bundle resultData);
3.используйте someReceiver в someResultreceiver
создать someService расширяет IntentService и использовать someresultReceiver.метод send() для отправки результатов из сервиса кто-то класс (например: MyActivity)
реализовать somereceiver на Activity
6.создание экземпляра someResultReceiver в классе MyActivity и setreceiver
- startService с намерением и putExtra someResultreceiver instanse
для получения более подробной информации о классе ResultReceiver см. Введите описание ссылки здесь
Comments