2016-06-10 53 views
0

我想通過LocalBroadcastManager發送PendingResult,因爲LocalBroadcastManager似乎不支持有序廣播。使用LocalBroadcastManager發送PendingResult參考(對於有序廣播)

我可以創建一個實現Parcelable的包裝對象,它包含PendingResult的內存引用,然後將其粘貼到一個Intent(根本沒有任何序列化)?真正的問題是:在使用LocalBroadcastManager通過Intents發送Parcelables時,Will對象內存引用是否完整,即LocalBroadcastManager是否僅將Intent Object引用轉發到我的應用程序中的不同位置?

有沒有更好的方法來做到這一點?

+0

我沒有關於您的問題的答案,但是如果您可以自由地將代碼庫添加到代碼中,請查看EventBus(https://github.com/greenrobot/EventBus),它是爲使用而設計的類似你的情況。 –

+0

不幸的是,我已經使用LocalBroadcastManager實現了它,因此無法開始使用它。 – JohnyTex

回答

0

我做了一個Parcelable包裝的PendingResult這樣:

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

} 

它可以綁在意圖,並通過廣播一個LocalBroadcastManager作爲Object引用,因爲本地廣播永遠不會真正序列化,這與進程間廣播不同。

它的工作原理!

0

這可以通過ResourcesHolder類從Android Hidden API library完成。雖然該庫專爲訪問內部API而設計,但發送任何對象是其能力之一。請看下面的例子:

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 

在你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"); 
}