thelinktodeath methodcanbeusedtoregisteraibinder.deathrecipientwiththeibinder,whichwillbecalledwhenitscontaingprocessiesion
这意味着我们可以在系统服务中申请某个服务的Binder,然后调用此IBinder的linkToDeath函数进行注册。 可以注册IBinder.DeathRecipient类型的对象。 其中IBinder.DeathRecipient是在IBinder类中定义的嵌入类。
publicabstractvoidlinktodeath I binder.deathrecipientrecipient,int flags )。
registertherecipientforanotificationifthisbindergoesaway.ifthisbinderobjectunexpectedlygoesaway typicallybecauseitseitshoshosting thenthegivenibinder.death recipient ‘ sdeathrecipient.binder died ) ) method will be called。
youwillonlyreceivedeathnotificationsforremotebinders,aslocalbindersbydefinitioncan ‘ tdiewithoutyoudyingaswell。
如果与该IBinder对应的Service进程异常终止,例如丢失到kill,则系统将调用该IBinder以前在linkToDeath中注册的DeathRecipient类对象的binderDied函数。
在典型实现中,Bp端用于注册linkToDeath并监听绑定服务的异常终止,而典型的binderDied函数实现用于释放相关资源。
publicabstractbooleanunlinktodeath I binder.deathrecipientrecipient,int flags )。
removeapreviouslyregistereddeathnotification.therecipientwillnolongerbecalledifthisobjectdies。
在服务器端在我编写的程序中,服务器端一直是在系统上运行的服务)实现DeathHandler,并在APP应用程序部分调用通告程序notifyprocessdiednewbinder ) ),如下所示
附带服务器端的DeathHandler实现。
publicbooleannotifyprocessdied ibindercb ) {
myservicedeathhandlerdeathhandler=newmyservicedeathhandler CB;
try {
CB.linktodeathdeathHandler,0 );
}catchremoteexceptione ) {
返回假;
}
返回真;
}
privateclassmyservicedeathhandlerimplementsibinder.death recipient {
私有I binder MCB;
publicmyservicedeathhhandler ibindercb ) {
mCb=Cb;
}
@Override
公共语音绑定器died
//releaseresourcewhenhostprocessdied。
}
公共I binder get binder
返回MCB;
}
}
关于使用unlinkToDeath )方法,这里没有具体的可以参考AudioManager和audio服务实现的示例。
其中,音频服务是服务器端,每个程序都有音频管理器,音频管理器是客户端端。
当APP应用程序进程被杀死时,AudioService需要释放一些资源。 所以,我们使用IBinder的链接到深度机制释放了一些资源。