Android:AIDL简单使用
16lz
2021-01-23
A I D L \color{#FF3030}{AIDL} AIDL
全称:(Android Interface Definition Language)android接口定义语言
应用场景:只有在需要不同应用的客户端通过 IPC(Inter-Process Communication:进程通信) 方式访问服务,并且希望在服务中进行多线程处理时,您才有必要使用 AIDL。官方文档
我与AIDl的相识源于一次尴尬的电话面试(两年前),对,没错就是空气突然的安静。。。我只能说出他的全称,在此之前我完全没有用到过,这是什么鬼东西,当安静下来查看相关文档发现AIDL的使用还是很简单的。
下面将以一个demo的方式来看他是如何使用的。
1.新建一个android工程(服务端),并在main路径下新建一个aidl文件,as会自动创建一个aidl路径
如文件:IAddInterface.aidl
package com.example.com.myAIDL;// Declare any non-default types here with import statementsinterface IAddInterface{ /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. * 支持java中的基础类型,short类型除外 * 以及List和Map,其中T为以上的基础类型,或实现了Parcelable 接口的自定义类型 */ void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString); //这是我们自己写的方法,目的是从客户端传入两个整数,在服务端对这两个整数进行加运算,然后将结果返回给客户端。 int add(int num1,int num2);}
写完接口文件后构建一下工程(make project或者所属的model),会在build目录下生成一个对应的java文件来给我们使用
2.在java路径下创建一个service服务,用于处理客户端传来的值
public class IRemoteService extends Service { /** * 当客户端绑定到该服务会执行 * @param intent * @return */ @Nullable @Override public IBinder onBind(Intent intent) { return iBinder; } //在此完成处理客户端传来的值的逻辑 private IBinder iBinder = new IAddInterface.Stub() { @Override public int add(int num1, int num2) throws RemoteException { Log.e("zhou","收到了num1="+num1+"num2="+num2); return num1+num2; } };}
3.在AndroidManifest中注册服务
<service android:name="com.example.com.myAIDL.IRemoteService" //必须全名,否则客户端会绑定失败 android:enabled="true" android:exported="true"/> //允许外部访问
4.创建一个新工程(客户端),并将在服务端中定义的aidl文件拷贝到客户端的相同位置,
需要注意的是要连带路径拷贝,同样构建项目
接下来我们看看是如何调用的
public class MainActivity extends AppCompatActivity { IAddInterface iAddInterface; private ServiceConnection coon = new ServiceConnection() { //绑定上服务时调用 @Override public void onServiceConnected(ComponentName name, IBinder service) { //拿到了远程的服务 iAddInterface = IAddInterface.Stub.asInterface(service); } //断开服务时 @Override public void onServiceDisconnected(ComponentName name) { iAddInterface = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindService(); //一定要在通信前先绑定 findViewById(R.id.tv_1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { int add = iAddInterface.add(1, 2); Log.e("zhou","和="+add); } catch (RemoteException e) { e.printStackTrace(); } } }); } private void bindService() { //获取到服务端 Intent intent = new Intent(); intent.setComponent(new ComponentName("com.example.com.myAIDL", "com.example.com.myAIDL.IRemoteService")); //服务端定义服务的全类名 //Context.BIND_AUTO_CREATE 已绑定服务端就自动启动服务 bindService(intent, coon, Context.BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); unbindService(coon); //销毁时断开绑定 }}
到此就完成了两个程序间的通讯。
更多相关文章
- android开发新浪微博客户端 完整攻略 [新手必读]
- 微信Android客户端后台保活经验分享
- 银联手机支付 手机客户端有几个?
- android蓝牙开发入门到精通2---查找可见蓝牙并绑定
- android极简原创系列:最简单的listview数据绑定
- Android腾讯微博客户端开发四:微博发送篇(QQ表情,@搜索)
- DataBinding(双向绑定)
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConn