深入解读Android的内部进程通信接口AIDL

2019-12-10 18:08:27王振洲

    
(3)实现客户端连接并且实现callback方法 

private ServiceConnection mRemoteConnection = new ServiceConnection() {
 
    @Override
    public void onServiceDisconnected(ComponentName name) {
      // TODO Auto-generated method stub
      Log.d(TAG, "onServiceDisconnected");
    }
 
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      // TODO Auto-generated method stub
      Log.d(TAG, "onServiceConnected");
      mRemoteService = (IMyAidlService) IMyAidlService.Stub
          .asInterface(service);
      if(mRemoteService != null)
        Log.d(TAG, "onServiceConnected success");
    }
  };
……
btn.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        String actionName = "com.zlc.aidl.server.MyAidlService";
        Intent intent = new Intent(actionName);
        boolean ret = bindService(intent, mRemoteConnection,
            Context.BIND_AUTO_CREATE);
        Log.d(TAG, " ret ?=" + ret);
        if (ret) {
          new Thread(new Runnable() {
 
            @Override
            public void run() {
              // TODO Auto-generated method stub
              try {
                DemoParcelable demo = new DemoParcelable();
                List<String> list = new ArrayList<String>();
                list.add("like dance");
                demo.setDemo_id((Integer) img.getTag());
                demo.setDemo_name("meinv1");
                demo.setDemo_list(list);
                mRemoteService.registerClient(callback);
                mRemoteService.saveDemoInfo(demo);
              } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }
            }
          }).start();
 
        }
      }
    });
  }
……
private final AIDLCallback callback = new AIDLCallback.Stub() {
     
 
    @Override
    public int returnResult(List<DemoParcelable> list, int a)
        throws RemoteException {
      if (list != null)
        Log.d(TAG, "list.size = " + list.size()+"  a="+a);
      for (DemoParcelable demoParcelable : list) {
        doFresh(demoParcelable);
      }
      return 0;
    }
 
    @Override
    public void testMethod(Bundle outParams) throws RemoteException {
      // TODO Auto-generated method stub
      if (outParams != null) {
        outParams.putInt("width", 11);
        outParams.putInt("height", 12);
      }
 
    }
  };