Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using ResultReceiver in Android

Fundamentally, I would like to establish a callback to an Activity from an IntentService. My question is very similar to the one answered here:

Restful API service

However, in the answer code, the activity code is seen as implementing a ResultReceiver. Unless I'm missing something, ResultReceiver is actually a class, so it cannot perform this implementation.

So essentially, I'm asking what would be the correct way to wire up a ResultReceiver to that service. I get confused with Handler and ResultReceiver concepts with respect to this. Any working sample code would be appreciated.

like image 855
Bill Eisenhauer Avatar asked Dec 22 '10 15:12

Bill Eisenhauer


People also ask

What is result receiver in android?

android.os.ResultReceiver. Generic interface for receiving a callback result from someone. Use this by creating a subclass and implement onReceiveResult(int, Bundle) , which you can then pass to others and send through IPC, and receive results they supply with send(int, Bundle) .


2 Answers

  1. You need to make custom resultreceiver class extended from ResultReceiver

  2. then implements the resultreceiver interface in your activity

  3. Pass custom resultreceiver object to intentService and in intentservice just fetch the receiver object and call receiver.send() function to send anything to the calling activity in Bundle object.

    here is customResultReceiver class :

     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);         }     }  } 

implements the Myresultreceiver.receiver interface in you activity, create a class variable

Public MyResultReceiver mReceiver; 

initialize this variable in onCreate:

mReceiver = new MyResultReceiver(new Handler());  mReceiver.setReceiver(this); 

Pass this mReceiver to the intentService via:

intent.putExtra("receiverTag", mReceiver); 

and fetch in IntentService like:

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

and send anything to activity using rec as:

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

this will be received in onReceiveResult of the activity. You can view complete code at:IntentService: Providing data back to Activity

Edit: You should call setReceiver(this) in onResume and setReceiver(null) in onPause() to avoid leaks.

like image 173
SohailAziz Avatar answered Sep 22 '22 13:09

SohailAziz


You override a method by subclassing. It doesn't have to be an interface to do that.

For example:

intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) {     @Override     protected void onReceiveResult(int resultCode, Bundle resultData) {         if (resultCode == StockService.RESULT_ID_QUOTE) {             ...         }     } }); 
like image 39
Eric Bowman - abstracto - Avatar answered Sep 21 '22 13:09

Eric Bowman - abstracto -