package com.anyun.exam.lib; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.text.TextUtils; import android.util.Log; import java.util.LinkedList; /** * MyApplication2 * Created by lzw on 2019/9/19. 18:19:48 * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ class SvrManager { private static final SvrManager ourInstance = new SvrManager(); private static final String TAG = "SvrManager"; private MyServiceConn conn; private IAYExamListener mCallback; //远程服务接口 private IRemoteInterface remoteInterface; static SvrManager getInstance() { return ourInstance; } private SvrManager() { } /** * 检查远程服务是否可以使用 * @return 可以用false,不可以用true */ private boolean checkRemoteIsNull() { return remoteInterface==null?true:false; } /** * Binder断裂回调 * 如果服务端进程由于某种异常原因停止 */ private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @Override public void binderDied() { Log.e(TAG,"IBinder.DeathRecipient binderDied"); if (remoteInterface != null){ Log.e(TAG,"IBinder.DeathRecipient binderDied remoteInterface != null ,return"); return; } remoteInterface.asBinder().unlinkToDeath(mDeathRecipient,0); remoteInterface = null; } }; public void registerListener(IAYExamListener iayExamListener) { this.mCallback = iayExamListener; } public void add() { if (!checkRemoteIsNull()){ try { remoteInterface.add(); } catch (RemoteException e) { e.printStackTrace(); } } } public void sendCmd(int cmd,String s) { if (!checkRemoteIsNull()){ try { remoteInterface.SendCmd(cmd,s); if(cmd == 0x8100){ MyLog.i(TAG,"CMD="+ String.format("0x%x",cmd) +" contentLength:"+(!TextUtils.isEmpty(s)?s.length():0)); }else{ MyLog.i(TAG,"CMD="+ String.format("0x%x",cmd) +" content:"+(!TextUtils.isEmpty(s)?s:"null")); } } catch (RemoteException e) { e.printStackTrace(); } } } class MyServiceConn implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { remoteInterface = IRemoteInterface.Stub.asInterface(service); try { //设置死亡代理 service.linkToDeath(mDeathRecipient,0); remoteInterface.registListener(RemoteCallback); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } } public void bindRemoteService(Context mContext){ Intent intent = new Intent(mContext,RemoteService.class); conn = new MyServiceConn(); mContext.bindService(intent,conn, Context.BIND_AUTO_CREATE); } public void unBindRemoteService(Context mContext){ if (remoteInterface!=null && remoteInterface.asBinder().isBinderAlive()){ try { remoteInterface.unRegistListener(RemoteCallback); } catch (RemoteException e) { e.printStackTrace(); } } mContext.unbindService(conn); } /** * 远程服务回调通知客户端消息 */ IListenerInterface RemoteCallback = new IListenerInterface.Stub(){ @Override public void onMessageArrived(int cmd, String json) throws RemoteException { if (mCallback != null){ mCallback.callBackMsg(cmd, json); } } }; }