一、建立服务端
-
创建完.aidl后
basicTypes这个方法可以无视,看注解知道这个方法只是告诉你在AIDL中你可以使用的基本类型(int, long, boolean, float, double, String),因为这里是要跨进程通讯的,所以不是随便你自己定义的一个类型就可以在AIDL使用的
我们在AIDL文件中定义一个我们要提供给第二个APP使用的接口。
like:
String getName(); -
sync project一下(tools>android>sync)
新建一个servicepublic 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配置
<service android:name=".MyService">
<intent-filter>
<action android:name="com.dawn.myaidl.IMyAidlInterface"></action>
</intent-filter>
</service>
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,这样就可以验证通过。