Android ResultReceiver 跨包

标签 android ipc android-service

我在包 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/

相关文章:

android - 何时使用和何时不使用 Android 中的服务

android - 应用程序关闭后无法使 Android 服务保持 Activity 状态

android - 单击 EditText 打开 DatePickerDialog 需要两次单击

Android SyncAdapter 不在我的设备 Samsung S6 Edge Plus Nougat 上同步(在 API<=23 上定期同步)

android - 使用 appMobi 我可以免费创建 Android 应用程序和 iPhone 应用程序(除了 Google/Apple 费用之外)吗?

java - Android:使用 Messengers for IPC 实现同步/阻塞 API

javascript - Firefox 扩展和 COM 组件之间的 IPC

windows - COM/Automation 如何在幕后进行 IPC?

android - 未到达接收器

android - 如何将来自 Android 应用程序的推文发布到一个特定帐户?