详解Android aidl的使用方法

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.aidl
package 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内容

 <service
      android:name=".FirstService"
      android:enabled="true"
      android:exported="true">
      <intent-filter>
        <action android:name="com.example.mytest.aidl.FirstService"/>
      </intent-filter>

    </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的使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android使用AIDL实现两个App间通信

    今天开发了一个功能,通过Android的AIDL机制完成两个app间的通信.功能需求很简单,一个客户端app,叫做client,一个服务端app叫orderManager:客户端负责展示订单列表,并且可以向服务端添加订单:服务端负责管理订单,可以对外提供订单信息. 闲言少叙,下面直接上代码. 1.编写bean类. 首先在client中定义OrderBean类,字段很简单,注意需要实现Parcelable接口: package com.example.wang.client.bean; impor

  • 实例讲解Android中的AIDL内部进程通信接口使用

    首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能. 如图,我们点击"播放"时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用哦),然后操作service中的音乐播放,点击"停止"则会终止播放.想要重新播放的话,必须先点"销毁service",再点播放按钮哦.(至于这里为什么要先点销毁按钮才能播放,完全是为了给大家展示下,远程调用service时,怎么去解绑se

  • Android Studio 引入 aidl 文件的方法汇总

    AndroidStudio 引入 aidl 文件,一般来说,有两种方法. 第一种方法 直接在 src/main 目录下新建 aidl 文件夹,并将我们的 aidl 文件放到该目录下.因为 AndroidStudio 默认的 aidl 文件默认配置是这样的. 第二种方法 把 adil 文件拷贝到libs文件夹下在build.gradle文件中配置 sourceSets { main { jniLibs.srcDirs = ['libs'] aidl.srcDirs = ['src/main/jav

  • Android AIDL中Map参数传递的问题详解

    前言 AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言. 我们都知道aidl是支持map作为参数传递的,但前提是map不能是泛型并且数据类型必须是aidl所支持的String,int等的Map参数: interface IMyAidl { void test(Map<String,String> datas); } 本以为这样写就可以正常往下进行了,但是这样会有错,抛出如下异常: 上述错误中首先说明不知道如何

  • Android Studio创建AIDL文件并实现进程间通讯实例

    在Android系统中,跨进程通信是非常普遍的事情,它用到了Binder机制处理进程之间的交互.Binder机制会开放一些接口给Java层,供android开发工程师调用进程之间通信.这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信.下面简单介绍用AndroidStudio创建AIDL文件的过程. a.新建AIDL文件 1.项目文件夹右键---> new --->选择AIDL 2.自定义一个接口名称 3.

  • Android AIDL实现两个APP间的跨进程通信实例

    本文为大家分享了Android AIDL实现两个APP间的跨进程通信实例,供大家参考,具体内容如下 1 Service端创建 首先需要创建一个Android工程然后创建AIDL文件,创建AIDL文件主要为了生成继承了Binder的Stub类,以便应用Binder进行进程间通信 servier端结构如下 AIDL代码如下 // IBookManager.aidl package com.example.bookserver.aidl; // Declare any non-default type

  • Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用,但ContentProvider主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?Android系统采用了远程过程调用(RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言

  • 详解Android aidl的使用方法

    AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写(对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互.) AIDL只是Android中众多进程间通讯方式中的一种方式, AIDL和Messenger的区别: Messenger不适用大量并发的请求:Messenger以串行的方式来处

  • 详解Android Checkbox的使用方法

    0和1是计算机的基础,数理逻辑中0和1代表两种状态,真与假.0和1看似简单,其实变化无穷. 今天我就来聊聊android控件中拥有着0和1这种特性的魔力控件checkbox. 先来讲讲Checkbox的基本使用.在XML中定义. <?xml version="1.0" encoding="utf-8"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android

  • 详解Android进程保活的方法

    关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你到网上搜 Android 进程保活,可以搜出各种各样神乎其技的做法,绝大多数都是极其不靠谱.前段时间,Github还出现了一个很火的"黑科技"进程保活库,声称可以做到进程永生不死. 怀着学习和膜拜的心情进去Github围观,结果发现很多人提了 Issue 说各种各样的机子无法成功保活. 看到这里,我瞬间就放心了.坦白的讲,我是真心不希望有这种黑科技存在的,它只会滋生更多的流氓应用,拖垮我大

  • 详解Android中实现Redux方法

    Redux 是一个用于应用程序状态管理的开源JavaScript库,其核心是通过可管理和控制的状态来描述一个系统.这意味着其思想其实是可以应用于任何类型应用的开发的,包括移动应用. Redux 架构基于一个严格的单向数据流,应用中的所有数据都是通过组件在一个方向上流动.Redux 希望确保应用的视图是根据确定的状态来呈现的.意思就是,在任何时间点,你应用的状态总是确定.有效的,并且可以转换到另一个可预测和有效的状态.而 UI 将根据所处的状态来进行呈现. 关于 Redux 在网上已经有很多相关的

  • 详解Android中Service AIDL的使用

    目录 前言 Service基本用法--本地服务 远程服务 -- AIDL 服务端 客户端 前言 有些朋友可能是从事开发工作的时间不是特别的长,所以觉得Service相对与另外两个组件activity.broadcast receiver来说,使用可能并不是特别的多,所以对Service来说,理解不是特别的深入,只是有一个大概的概念,今天就和一块来走一下Service,希望能够帮助到大家对Service有更深入的理解. Service基本用法--本地服务 我们知道服务分为本地服务和远程服务,而本地

  • 详解Android 视频播放时停止后台运行的方法

    详解Android 视频播放时停止后台运行的方法 在项目中,遇到了视频播放,可是后台播放的音乐也同时播放,我们要的效果肯定是视频播放的时候,音乐暂停,视频播放完了我们就继续播放音乐,于是就找到了这个方法. /**@param bMute 值为true时为关闭背景音乐.*/ @TargetApi(Build.VERSION_CODES.FROYO) public static boolean muteAudioFocus(Context context, boolean bMute) { if(c

  • 详解Android使用@hide的API的方法

    详解Android使用@hide的API的方法 今天早上想修改MediaPlaybackService.Java(/packages/apps/Music)的代码. 将AudioManager.STREAM_MUSIC改成AudioManager.STREAM_TTS. 发现AudioSystem.java(/frameworks/base.media/java/Android/media) /* @hide The audio stream for text to speech (TTS) *

  • 详解Android studio如何导入jar包方法

    下面我就总结一下Android studio大家在导入jar包时遇到的一些问题和解决方法: 1,首先先说一下怎么在AS 中找到sdk,jdk,ndk的安装路径,可能一部分人一开始找不到,下面贴出方法: Android studio 中更改sdk的路径,如下图,在右边红色方框中更改sdk的路径 还有一种更好的方式可以把sdk,jdk,ndk的路径全部找到,首先File---Other Settings---Default Project Structure...,打开如下图界面,从红方框处即可直接

  • 详解Android StrictMode严格模式的使用方法

    Android 2.3提供一个称为严苛模式StrictMode的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益.那它都做什么呢?它将报告与线程及虚拟机相关的策略违例.一旦检测到策略违例policy violation,你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例.你可以强制用警告代替崩溃crash,也可以仅将警告计入日志让你的应用继续执行.StrictMode是一个十分有用的类,它可以很方便地应用于检查Android应用程序的性能和存在的

  • 详解Android跨进程通信之AIDL

    需求描述 进程A调起第三方进程B进行第三方登录 – 实现双向通信 代码(进程A) 1.目录结构 2.LoginActivity.java public class LoginActivity extends AppCompatActivity { private ILoginInterface iLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSta

随机推荐