Android Parcel并传递一个带有Listener的对象

时间:2014-01-29 14:03:09

标签: android android-intent parcelable

有什么方法可以传递一个有View.OnClickListener的Parcelable(通过Intent)吗?

基本上我希望能够从任何地方启动一个常见的Actvity并将OnClickListener传递给一个在Activity上定义的按钮。

或者我不需要发送OnClickListener,它只是一个固定的OnClickListener可以回调的自定义接口实现,问题是我看不到任何方式来包裹任何类似回调(一种方法,以后可以被称为)

我曾尝试过以下

  destParcel.writeValue(mListener)

但它抛出了以下内容

  java.lang.RuntimeException: Parcel: unable to marshal value

那么无论如何要编写一个可包含的回调?

2 个答案:

答案 0 :(得分:5)

  

有什么方法可以传递一个有View.OnClickListener的Parcelable(通过Intent)吗?

没有任何有意义的方式。 Parceling是按值复制的,而不是按引用复制的,因此它与接收方的对象不同于发送方。

  

基本上我希望能够从任何地方启动一个常见的Actvity并将OnClickListener传递给一个在Activity上定义的按钮。

使用活动巴士(Square's Otto,greenrobot的EventBus,LocalBroadcastManager等)。

或者,使用PendingIntent

或者,使用Messenger

或者,使用ResultReceiver,这是与“parcellable callback”最接近的事情。

答案 1 :(得分:0)

您必须创建一个扩展View.OnClickListener并实现Parcelable接口的类。如果您有多个侦听器,则可以使用要调用的方法实现公共接口。

只要您可以保存和恢复包中的所有班级成员,这将有效。但是,如果您的侦听器想要引用View对象,那么这将无效并且发送它没有多大意义。