我在包 A (SignerClient) 中有一个 Activity ,在包 B (MyService) 中有一个服务
Activity 的结果接收者:
private ResultReceiver resultreceiver = new ResultReceiver(null) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
...
}
};
启动服务:
Intent intent = new Intent("com.example.STARTSERVICE");
intent.putExtra("resultreceiver", resultreceiver);
startService(intent);
接收端:
ResultReceiver rr = (ResultReceiver) intent.getParcelableExtra("resultreceiver");
当客户端和服务器在同一个包中时执行此操作效果很好。但在这种情况下我得到:
FATAL EXCEPTION: IntentService[MyService]
android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.cryptoclient.SignerClient$1
at android.os.Parcel.readParcelable(Parcel.java:1883)
at android.os.Parcel.readValue(Parcel.java:1771)
at android.os.Parcel.readMapInternal(Parcel.java:2008)
at android.os.Bundle.unparcel(Bundle.java:208)
at android.os.Bundle.getParcelable(Bundle.java:1100)
at android.content.Intent.getParcelableExtra(Intent.java:3396)
at org.axades.service.MyService.onHandleIntent(MyService.java:28)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.os.HandlerThread.run(HandlerThread.java:60)
我错过了什么?我的想法是否可行?
最佳答案
我想跨包使用 ResultReceiver
并且必须加载其他包的上下文对我来说似乎不合适......毕竟,接收包不需要知道使用 ResultReceiver
的特定子类,它只需要能够调用 send()
并让 IPC 绑定(bind)器魔法发生。需要让特定的子类可用似乎是一个设计缺陷。
有一个解决方法:
public static ResultReceiver receiverForSending(ResultReceiver actualReceiver) {
Parcel parcel = Parcel.obtain();
actualReceiver.writeToParcel(parcel,0);
parcel.setDataPosition(0);
ResultReceiver receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel);
parcel.recycle();
return receiverForSending;
}
此代码将 ResultReceiver
的某个子类的实例转换为 ResultReceiver
本身的实例,尽管如此,它仍将结果发送到您的原始 actualReceiver
. receiverForSending
可以在 Intent
extra 中发送到另一个包,并且可以很好地解码。
关于Android ResultReceiver 跨包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5743485/