AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写(对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。)

AIDL只是Android中众多进程间通讯方式中的一种方式,

AIDL和Messenger的区别:

  1. Messenger不适用大量并发的请求:Messenger以串行的方式来处理客户端发来的消息,如果大量的消息同时发送到服务端,服务端仍然只能一个个的去处理。
  2. Messenger主要是为了传递消息:对于需要跨进程调用服务端的方法,这种情景不适用Messenger。
  3. Messenger的底层实现是AIDL,系统为我们做了封装从而方便上层的调用。
  4. AIDL适用于大量并发的请求,以及涉及到服务端端方法调用的情况

AIDL通信的原理:首先看这个文件有一个叫做proxy的类,这是一个代理类,这个类运行在客户端中,其实AIDL实现的进程间的通信并不是直接的通信,客户端和服务端都是通过proxy来进行通信的:客户端调用的方法实际是调用是proxy中的方法,然后proxy通过和服务端通信将返回的结果返回给客户端。

1、AIDL的作用

AIDL是用于Android的IPC通讯的,因此可以在一个APP内部通讯,也可以创建两个APP之间进行通讯。

AIDL的职能分配很明确,Service作为后台运行作为服务器管理各种交互,Client作为客户端请求数据或调用Service的方法。

2、AIDL的简单使用

1)创建一个aidl文件,直接右键创建就可以了,

package com.example.mytest;

// IMyAidlInterface.aidlpackage com.example.mytest; // Declare any non-default types here with import statements interface IMyAidlInterface {  /**   * Demonstrates some basic types that you can use as parameters   * and return values in AIDL.   */  void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,      double aDouble, String aString);  String add(int x , int y);}

2)选中刚刚建立的 .aidl文件 生产对应的java文件。

AndroidStudio 可以通过Build--》model App 完成

3)编写Service的具体对象 实现接口

package com.example.mytest;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class FirstService extends Service {  public FirstService() {  }  private static String Tag = "FirstService";  @Override  public IBinder onBind(Intent intent) {    // TODO: Return the communication channel to the service.    //throw new UnsupportedOperationException("Not yet implemented");    Log.d(Tag,"service on bind");    return mBinder;  }  @Override  public void onCreate() {    super.onCreate();    Log.d(Tag,"OnCreate");  }  @Override  public int onStartCommand(Intent intent, int flags, int startId) {    Log.d(Tag,"onStartCommand");    return START_STICKY;  }  @Override  public boolean onUnbind(Intent intent) {    Log.d(Tag,"onUnbind");    return super.onUnbind(intent);  }  @Override  public void onDestroy() {    super.onDestroy();    Log.d(Tag,"onDestroy");  }  IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){    @Override    public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {    }    @Override    public String add(int x, int y) throws RemoteException {      Log.d(Tag,x + "--" + y);      return String.valueOf(x + y);    }  };}

注意:onBund 返回IBinder类型,为了后面的回调会调动

4)确定一下AndroidManifest.xml里面的Service内容

                          

5)打开服务

 private Button btnStartService;   private Button btnBindService;    @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);     initView();  }   private void initView() {    tvId = (TextView) findViewById(R.id.tv_id);     btnStartService = (Button) findViewById(R.id.btn_Start_Service);    btnStartService.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        Intent intent = new Intent();        intent.setPackage("com.example.mytest");        intent.setAction("com.example.mytest.aidl.FirstService");        startService(intent);      }    });     btnBindService = (Button) findViewById(R.id.btnBindService);    btnBindService.setOnClickListener(new View.OnClickListener() {      @Override        public void onClick(View view) {            bind();        }    });     private void bind(){    Log.d(Tag, "bind");    Intent intent = new Intent();    intent.setPackage("com.example.mytest");    if(controllerConnection != null){      this.bindService(intent,controllerConnection,this.BIND_AUTO_CREATE);//绑定服务,建立链接    }    else {      Log.d(Tag, "controllerConnection != null");    }  }   private void unbind(){    if(controllerConnection != null && myAIDLController.asBinder().isBinderAlive()){      try{        Log.d(Tag, "this.unbindService(controllerConnection);");        this.unbindService(controllerConnection);      } catch (Exception localException) {        Log.w(Tag, "unbind Exception localException");      }    }  }

在bind的时候是异步的,因此可以通过onServiceConnected()来判断绑定上后的操作。

private ServiceConnection controllerConnection = new ServiceConnection(){     @Override    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {      Log.d(Tag,"onServiceConnected");       myAIDLController = IMyAidlInterface.Stub.asInterface(iBinder);      if (myAIDLController != null) {        try {          Log.d(Tag, "ServiceConnection success");          Toast.makeText(MainActivity.this, "ServiceConnection success", Toast.LENGTH_LONG).show();        } catch (Exception localException) {          Log.w(Tag, "Exception localException");        }      }    }     @Override    public void onServiceDisconnected(ComponentName componentName) {      Log.d(Tag,"onServiceDisconnected");      Toast.makeText(MainActivity.this, "onServiceDisconnected", Toast.LENGTH_LONG).show();       myAIDLController = null;    }     @Override    public void onBindingDied(ComponentName name) {      Log.d(Tag,"onBindingDied");    }     @Override    public void onNullBinding(ComponentName name) {      Log.d(Tag,"onNullBinding");    }  };

6)调用Service方法add()

调用的时候需要绑定Service方法,上面已经有了,接下来调用就简单了,创建一个Button,然后拿到Service的控制对象,调用方法add

 btnServiceFunc = (Button) findViewById(R.id.btnServiceFunc);    btnServiceFunc.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        try {          Log.d(Tag, String.valueOf( myAIDLController.add(1,2)));        } catch (RemoteException e) {          e.printStackTrace();        }      }    });

到此这篇关于详解Android aidl的使用方法的文章就介绍到这了,更多相关Android aidl的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

更多相关文章

  1. Android中两种使用Animation的方法
  2. Genymotion Android模拟器下载和找不到模拟器解决方法
  3. Android app闪退后fragment重叠bug解决方法
  4. zz:Android 测试工具Monkey & Monkeyrunner 使用方法
  5. Android 完全退出当前应用程序的四种正确方法
  6. Handler 使用方法详解
  7. Linux下的两种timer方法 (Android 下NDK开发)
  8. Android中VideoView播放当前工程中视频文件的方法
  9. Android Studio 中报错 程序包org.apache.http不存在 的解决方法

随机推荐

  1. Android登录界面的实现代码分享
  2. Android中OnkeyDown事件和OnBackPressed
  3. Android中使用GPS和NetWork获取定位信息
  4. java/android 设计模式学习笔记(5)---对象
  5. Android下增加service和对应的AIDL
  6. Android(安卓)IPC 进程间通信实现理解
  7. ANDROID 如何适配屏幕
  8. 说说Android中的style和theme
  9. 常用Android开发组件之列表类组件
  10. git下载Android源代码(含kernel)