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路径
Android:AIDL简单使用_第1张图片
如文件: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文件来给我们使用
Android:AIDL简单使用_第2张图片
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文件拷贝到客户端的相同位置,
需要注意的是要连带路径拷贝,同样构建项目
Android:AIDL简单使用_第3张图片接下来我们看看是如何调用的

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); //销毁时断开绑定    }}

到此就完成了两个程序间的通讯。

更多相关文章

  1. android开发新浪微博客户端 完整攻略 [新手必读]
  2. 微信Android客户端后台保活经验分享
  3. 银联手机支付 手机客户端有几个?
  4. android蓝牙开发入门到精通2---查找可见蓝牙并绑定
  5. android极简原创系列:最简单的listview数据绑定
  6. Android腾讯微博客户端开发四:微博发送篇(QQ表情,@搜索)
  7. DataBinding(双向绑定)
  8. android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConn

随机推荐

  1. Android Studio设置类代码模板
  2. android抓取各种log的方法
  3. android listView的为空时显示
  4. Android studio3.0 com.android.tools.aa
  5. 【转】如何获取Android系统时间是24小时
  6. android 学习资源收藏备份
  7. Android 实现 zlib压缩与解压
  8. android利用ViewPager做的介绍软件功能de
  9. Android之SurfaceView(一)
  10. Android之访问下载文件