系列文章
AIDL-基本使用
AIDL-自定义数据类型
AIDL-修饰符in,out,inout
AIDL-重连方法
AIDL-接口注册/解注册
AIDL-连接池
知识点
- 服务保活的常用方法
- service重连
一、服务保活的常用方法会
一般service保活的方法有:
提高进程优先级
,
开启前台服务
,
断开重连
,
系统白名单
二、service重连
aidl断开重连,实际就是对service的重新绑定,所以可以在监听到服务断开的时候进行重新绑定,这里提供两种常用方法:
2.1 onServiceDisconnected
在bindService的时候,会有个服务连接状态监听,可以通过这个监听去监听断开的状态,然后进行重新绑定
ServiceConnection conn= new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LogUtil.d("onServiceConnected");
iPerson = IPerson.Stub.asInterface(service);
Toast.makeText(AIDLClientAcitvity.this, "onServiceConnected", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
LogUtil.d("onServiceDisconnected");
//断开重新绑定
bindServiceByAidl();
}
};
2.2 binder的死亡代理
死亡代理要在service连接成功和断开的时候分别注册/解注册
private IBinder.DeathRecipient deathRecipient=new IBinder.DeathRecipient() {
@Override
public void binderDied() {
//解绑
if(iPerson!=null){
iPerson.asBinder().unlinkToDeath(deathRecipient,0);
iPerson=null;
}
//断开重新绑定
bindServiceByAidl();
}
};
ServiceConnection conn= new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LogUtil.d("onServiceConnected");
try {
//设置死亡代理
service.linkToDeath(deathRecipient,0);
} catch (RemoteException e) {
e.printStackTrace();
}
iPerson = IPerson.Stub.asInterface(service);
Toast.makeText(AIDLClientAcitvity.this, "onServiceConnected", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
LogUtil.d("onServiceDisconnected");
}
};
另外,我们可以使用如下方法判断binder是否已经死亡:
private void binderIsAlive(){
if(iPerson!=null){
iPerson.asBinder().isBinderAlive();
}
}
ps:这两种方法的区别是onServiceDisconnected在客户端的UI线程中被回调,而binderDied在客户端的Binder线程池中被回调
总结
服务断开重连在日常做服务建通信往往是需要加上的,因为没有谁可以确保自己的与服务端一直保持着连接状态,所以如果在需要保持通信的时候,都要加上对服务断开重连的方法,当然这里只是提供了两种常用的方法,其他的方法应该也还有的,这里就不做那么多的扩展了