AIDL 回调中的 IllegalStateException

beginBroadcast java.lang.IllegalStateException

已知在 aidl 中回调注册的 callback 对象时, 需要使用 beginBroadcast() 和 finishBroadcast(), 且一个 begin 之后对应一个 finish;
下面是官方建议的回调的写法;

如果在调用 beginBroadcast() 之前, 上一个 begin 没有调用 finishBroadcast() 来结束传播, 就会引发异常"beginBroadcast() called while already in a broadcast"

beginBroadcast

getBroadcastItem

finishBroadcast


这次遇到 "callbacks.getBroadcastItem(i).somethingHappened()" 时发生 "java.lang.IllegalStateException: beginBroadcast() called while already in a broadcast" 异常

一开始以为是 getBroadcastItem() 发生了异常, 查看源码发现不可能是这个方法产生异常; 再将 "callbacks.getBroadcastItem(i).somethingHappened()" 分成两个语句, 发现是 somethingHappened() 这个回调引发了异常;

查看其它应用对 callback 中回调方法的处理, 发现是某一个应用的注册回调, 在方法中调用了 beginBroadcast() 但是没有调用 finishBroadcast(); 结果触发了 IllegalStateException 异常, 经由 Parcel 的 readException() 转发到了 Service 端;

0 Comments
Leave a Reply