0

I want to send a PendingResult via a LocalBroadcastManager since ordered broadcasts doesn't seem to be supported with LocalBroadcastManager.

Can I make a wrapper object that implements Parcelable, which contains a memory reference to a PendingResult and then stick it to an Intent (without any serialization at all)? The question really is: Will Object memory references be intact when sending Parcelables via Intents using LocalBroadcastManager, i.e. does LocalBroadcastManager really only forward Intent Object references to different places within my app?

Or

Is there a better way to do this?

JohnyTex
  • 3,323
  • 5
  • 29
  • 52
  • I don't have an answer regarding your question, but if you are free to add libraries to your code, have a look at EventBus (https://github.com/greenrobot/EventBus) it was designed for a use case like yours. – A. Steenbergen Jun 10 '16 at 14:54
  • Unfortunately I have already implemented it using LocalBroadcastManager and is thus unable to start using that. – JohnyTex Jun 10 '16 at 14:56

2 Answers2

0

This can be done via ResourcesHolder class from Android Hidden API library. Although the library is designed for accessing internal API, but sending any objects is one of its ability. Look at this example:

ResourcesHolder holder = new ResourcesHolder()
    // you also able to put multi-object, but give each of them different 'key'
    .put("pi1", myPendingIntent1)
    .put("pi2", myPendingIntent2);

// send via context.sendBroadcast(intent)
holder.sendBroadcast(context, "myKey");

// or send via LocalBroadcastManager
holder.sendViaLocalBroadcastManager(context, "myKey");

// don't forget to register your receiver with IntentFilter ResourcesHolder.ACTION_SEND_RESOURCES_HOLDER

In your BroadcastReceiver:

// to get them back:
if (intent.getAction().equals(ResourcesHolder.ACTION_SEND_RESOURCES_HOLDER){
    ResourcesHolder holder = intent.getParcelableExtra("myKey");
    PendingIntent pi1 = (PendingIntent) holder.getAsObject("pi1");
    PendingIntent pi2 = (PendingIntent) holder.getAsObject("pi2");
}
Anggrayudi H
  • 14,977
  • 11
  • 54
  • 87
0

I made a Parcelable wrapper for PendingResult as such:

public class PendingResultWrapper implements Parcelable {

    private BroadcastReceiver.PendingResult pendingResult; //The only thing we care about in this class!

    public PendingResultWrapper(BroadcastReceiver.PendingResult pendingResult) {
        this.pendingResult = pendingResult;
    }

    protected PendingResultWrapper(Parcel in) {
    }

    public static final Creator<PendingResultWrapper> CREATOR = new Creator<PendingResultWrapper>() {
        @Override
        public PendingResultWrapper createFromParcel(Parcel in) {
            return new PendingResultWrapper(in);
        }

        @Override
        public PendingResultWrapper[] newArray(int size) {
            return new PendingResultWrapper[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
    }

    public BroadcastReceiver.PendingResult getPendingResult() {
        return pendingResult;
    }

}

It can be strapped to an Intent and broadcasted by a LocalBroadcastManager as an Object reference because local broadcasts are never really serialized, unlike inter-process broadcasts.

It works!

JohnyTex
  • 3,323
  • 5
  • 29
  • 52