AIDL服务死亡代理
通过AIDL与服务端进行通信时,意外发生服务终止的解决方法。
1、设置服务死亡代理deathRecipient
private final ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { isConnection = true; sceneAPI = IModeAPI.Stub.asInterface(iBinder); try { sceneAPI.asBinder().linkToDeath(deathRecipient, 0); } catch (RemoteException e) { e.printStackTrace(); } LogUtils.e(TAG, "mode control service connection successful"); }
2、在代理对象中重连服务
/** * 重连服务 */ private void reconnectService() { Log.d(TAG, "mode control service binder died"); sceneAPI.asBinder().unlinkToDeath(deathRecipient, 0); ThreadUtils.runOnUiThreadDelayed(this::bindServiceInvoked, 1000); } /** * 设置服务死亡代理 */ IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { isConnection = false; reconnectService(); } }; /** * 绑定服务 */ public void bindServiceInvoked() { Intent intent = new Intent(); intent.setAction(SERVICE_ACTION); intent.setPackage(SERVICE_PACKAGE); isConnection = context.bindService(intent, connection, Context.BIND_AUTO_CREATE); }