![]() |
1
54
这些异常确实会被抛出,您应该编写适当的Try/Catch逻辑来处理您在服务上调用的远程方法没有完成的情况。
至于你的调查,你是在正确的轨道上通过本地来源。你可能忽略了的是
如果活动使用在另一个进程中运行的服务,而该进程在执行请求的过程中死亡,那么它将看到此异常。我可以通过对 Marko Gargenta's AIDLDemo example . 首先,通过更新androidmanifest.xml确保服务在自己的进程中运行:
然后修改
在logcat中,您可以看到服务进程死亡,活动接收
我可以想象,如果您的服务与您的活动运行在同一个进程中,您可能永远不会看到这个异常,但如果是这样的话,您可能不会对AIDL感到困扰。 此外,正如您所发现的,Android不会在进程之间传输异常。如果您需要将错误传回呼叫活动,那么您需要使用其他方法。 |
![]() |
2
6
如果 过程 托管远程对象不再可用,这通常意味着进程崩溃。 然而,之前的评论,以及官方的Android文档都是错误的,因为DeadObjectException是唯一一个返回到客户机的异常。在AIDL服务实现中抛出的某些类型的运行时异常将被传递回客户机并在那里重新调用。如果您查看binder.exectransact()方法,您将看到它捕获runtimeexception并将一些select返回到客户机。 下面列出了接受此特殊处理的RuntimeExceptions。您还可以检查package.writeException进行验证。绑定器类使用该方法将异常封送到一个包中,并将其传输回客户端,在客户端中,它将作为parcel.readException的一部分重新引发。
我偶然发现了这种行为,我在客户机端看到了意外的异常,而我的服务没有崩溃,当它应该出现非法状态异常时。完全写入: https://blog.classycode.com/dealing-with-exceptions-in-aidl-9ba904c6d63 |
![]() |
3
1
这里的关键是“异常尚不支持跨进程”。确实会抛出RemoteException,但不会直接抛出。 每个 处理AIDL调用时在远程服务中引发的异常将导致应用程序接收到远程异常。 |
![]() |
Michel · 在Android上后台播放音频超过一分钟 2 年前 |
![]() |
category · 在服务中处理较长的Pod响应时间 6 年前 |
![]() |
theDoron1 · C#服务未将文件移动到正确的文件夹 6 年前 |
![]() |
XpressGeek · 应用程序被终止时广播接收器未调用服务 6 年前 |
![]() |
anakin59490 · 角度5-组件和服务之间的通信 6 年前 |