在Android 10及以上版本中,如果你在使用Binder IPC(跨进程通信)时,并且一个应用程序连接到服务的进程崩溃或停止运行,则可能会抛出DeadObjectException异常。这是因为在Android 10中引入了一个名为“killBackgroundProcesses”的新方法,该方法调用会在进程崩溃或停止运行时杀死其后台进程。当此方法被调用时,与该进程连接的所有客户端都将收到DeadObjectException异常。
解决此问题的一个例子是在你的客户端代码中实现一个死亡监听器。当与服务断开连接或服务崩溃时,该监听器将被通知并执行清理操作。下面是一个简单的示例代码:
public class MyServiceConnection implements ServiceConnection { private MyService myService; private boolean mIsBound;
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = ((MyService.MyBinder) service).getService();
mIsBound = true;
myService.setDeathRecipient(mDeathRecipient); // 设置死亡监听器
}
@Override
public void onServiceDisconnected(ComponentName name) {
myService = null;
mIsBound = false;
}
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
if (myService != null) {
myService.asBinder().unlinkToDeath(mDeathRecipient, 0); // 解除与死亡监听器的绑定
myService = null;
// 执行清理操作
}
}
};
public void unbindService(Context context) {
if (mIsBound) {
if (myService != null) {
myService.asBinder().unlinkToDeath(mDeathRecipient, 0);
myService = null;
}
context.unbindService(this);
mIsBound = false;
}
}
}
在上面的代码中,在与服务连接时,我们将死亡监听器设置为MyService实例,并在其死亡时执行清理操作。在服务断开连接时,我们解除与死亡监听器的绑定,并将其设置为null。在解绑服务时,我们还必须解除与死亡监听器的绑定,并将其设置为null