3

Regarding the code from the answer to this question Restful API service I've tested it and it works. I've condensed it a little for the purpose of my question, which is to understand how the member variable mReceiver in class MyResultReceiver survives the Parcel write process:

intent.putExtra("receiver", mReceiver); 

and the read process:

final ResultReceiver receiver = intent.getParcelableExtra("receiver");

When the send method is called on the receiver, since there is no code that I can see that Parcels the mReceiver member variable, I expect mReceiver to be null but it is not, why?

Full code example:

public class HomeActivity extends Activity implements MyResultReceiver.IReceiver {

    public MyResultReceiver mReceiver;

    public void onCreate(Bundle savedInstanceState) {
        mReceiver = new MyResultReceiver(new Handler());
        mReceiver.setReceiver(this);
        final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, QueryService.class);
        intent.putExtra("receiver", mReceiver);
        intent.putExtra("command", "query");
        startService(intent);
    }
}

public class QueryService extends IntentService {
    protected void onHandleIntent(Intent intent) {
        final ResultReceiver receiver = intent.getParcelableExtra("receiver");
        receiver.send(0, Bundle.EMPTY);
    }
}

public MyResultReceiver extends ResultReceiver {

    private IReceiver mReceiver;

    public MyResultReceiver(Handler handler) {
        super(handler);
    }

    public void setReceiver(Receiver receiver) {
        mReceiver = receiver;
    }

    public interface IReceiver {
        public void onReceiveResult(int resultCode, Bundle resultData);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (mReceiver != null) {
            mReceiver.onReceiveResult(resultCode, resultData);
        }
    }
}
Community
  • 1
  • 1
sja26
  • 653
  • 12
  • 22

0 Answers0