1. Android 多进程开发中的服务端死亡回调机制
1.1 死亡回调的基本原理与实现
在Android多进程开发中,服务端进程可能会因为各种原因意外终止(如系统资源不足、崩溃等)。作为客户端,我们需要一种机制来及时感知这种异常情况,这就是死亡回调(DeathRecipient)的核心价值。
死亡回调的实现依赖于Binder机制底层提供的linkToDeath方法。当我们在客户端绑定服务时,可以通过ServiceConnection获取服务端的Binder对象,然后调用其linkToDeath方法注册监听:
java复制private final IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
Log.i(TAG, "服务端进程已终止");
// 这里可以执行重连或其他恢复逻辑
}
};
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
service.linkToDeath(deathRecipient, 0);
myAidlInterface = IMyAidlInterface.Stub.asInterface(service);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
注意:linkToDeath的第二个参数flags通常设为0,这是系统保留参数,当前版本未使用。
1.2 系统自动清理机制解析
很多开发者会有疑问:是否需要手动调用unlinkToDeath?从Android源码分析可以看到,系统已经为我们处理了大部分清理工作:
java复制// 摘自ServiceDispatcher.java
public void doDeath(ComponentName name, IBinder service) {
synchronized (this) {
ConnectionInfo old = mActiveConnections.get(name);
if (old == null || old.binder != service) return;
mActiveConnections.remove(name);
old.binder.unlinkToDeath(old.deathMonitor, 0);
}
mConnection.onServiceDisconnected(name);
}
当服务端进程死亡时,系统会:
- 从活跃连接记录中移除该服务
- 自动调用unlinkToDeath解除死亡监听
- 触发onServiceDisconnected回调
1.3 死亡回调的线程模型
死亡回调的执行线程是需要特别注意的。不同于ServiceConnection的回调(在主线程执行),死亡回调会在Binder线程池中的某个线程执行:
java复制private final IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
//
