AIDL

一、建立服务端

AIDL_第1张图片
新建.aidl.png
  • 创建完.aidl后

    basicTypes这个方法可以无视,看注解知道这个方法只是告诉你在AIDL中你可以使用的基本类型(int, long, boolean, float, double, String),因为这里是要跨进程通讯的,所以不是随便你自己定义的一个类型就可以在AIDL使用的

    我们在AIDL文件中定义一个我们要提供给第二个APP使用的接口。
    like:
    String getName();

  • sync project一下(tools>android>sync)
    新建一个service

      public class MyService extends Service {
    
          public MyService() {
          }
      
          @Nullable
          @Override
          public IBinder onBind(Intent intent) {
              return new myBind();
          }
      
          class myBind extends IMyAidlInterface.Stub {
      
              @Override
              public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
              }
      
              @Override
              public String getName() throws RemoteException {
                  return "test my aidl";
              }
          }
      }
    
  • 在androidmanifest配置






AIDL调用方代码

  • 将我们的AIDL文件拷贝到第二个项目,然后sycn project一下工程。
    这边的包名要跟第一个项目的一样哦,这之后在Activity中绑定服务。

      public class MainActivity extends AppCompatActivity {
    
      IMyAidlInterface iMyAidlInterface;
      Button aidlBtn;
    
    
      private  ServiceConnection serviceConnection = new ServiceConnection() {
          @Override
          public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
              iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);//获取服务对象
    
      }
    
      @Override
      public void onServiceDisconnected(ComponentName componentName) {
    
      }
      };
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
    
    
      // 我们没办法在构造Intent的时候就显式声明.
      Intent intent = new Intent("com.dawn.myaidl.IMyAidlInterface");
      // 既然没有办法构建有效的component,那么给它设置一个包名也可以生效的
      intent.setPackage("com.dawn.myplugin");// the service package
    
      bindService(intent, serviceConnection, BIND_AUTO_CREATE);
      aidlBtn = (Button) findViewById(R.id.button);
      aidlBtn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              try {
                  Toast.makeText(MainActivity.this, iMyAidlInterface.getName(), Toast.LENGTH_SHORT).show();
              } catch (RemoteException e) {
                  e.printStackTrace();
              }   
          }
      });
      }
      }
    
  • Service隐式意图启动 不支持5.0及以上的系统

  • 不是不支持,只是要求在隐式启动的时候带上component或者packageName。ContextImpl源码中validateServiceIntent方法对service安全性判断是在component和packageName同时为空并且当前SDK版本高于KITKAT的情况下才会抛出IllegalArgumentException异常。Google官方推荐的方式是在设置action的同时设置packageName,这样就可以验证通过。

你可能感兴趣的:(AIDL)