1 AIDL 简介

AIDL(Android Interface Definition Language)是一种接口定义语言,用于生成可在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。通过定义编辑 adil 文件,build 后生成对应的 java 类。

如下,为定义的 MessageManager.aidl 文件经 build 后,生成的 MessageManager.java 接口的框架。该接口包含 sendMsg() 和 getMsg() 两个方法,以及一个名为 Stub 的静态抽象内部类;Stub 继承了 Binder,并实现了 MessageManager 接口,其内部定义了一个名为 Proxy 的静态内部类;Proxy 实现了 MessageManager 接口。

Android——使用AIDL实现进程间通讯简单案例_第1张图片 系统生成的 MessageManager 接口框架

本文全部代码见→使用AIDL实现进程间通讯简单案例

2 项目结构

Android——使用AIDL实现进程间通讯简单案例_第2张图片

注意: aidl_C 和 aidl_S 下的 com.zhyan8.aidl 包名及其中的 aidl 文件必须一致。

3 服务端 aidl_S 代码

(1)创建 aidl 文件

MessagManager.aidl

package com.zhyan8.aidl;interface MessageManager {    void sendMsg(String msg);    String getMsg();}

注意:方法前不要添加 public 等修饰符。

(2)创建服务

MyService.java

package com.zhyan8.aidl_s;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import com.zhyan8.aidl.MessageManager;public class MyService extends Service {    @Override    public IBinder onBind(Intent intent) {        return mBind;    }    MessageManager.Stub mBind = new MessageManager.Stub() {        @Override        public void sendMsg(String msg) throws RemoteException {            Log.d("MyService", "客户端发来消息: " + msg);            System.out.println(msg);        }        @Override        public String getMsg() throws RemoteException {            return "abcde"; //客户端待接收的消息        }    };}

(3)注册服务

在 AndroidManifest.xml 文件中 application 节点下注册 service,如下。

                

(4)主 Activity

MainActivity.java

package com.zhyan8.aidl_s;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

4 客户端 aidl_C 代码

(1)复制 aidl 文件

将 aidl_S 下的 com.zhyan8.aidl 包及其中的 aidl 文件复制到 aidl_C 中 。

(2)设计布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>        

界面如下:

Android——使用AIDL实现进程间通讯简单案例_第3张图片

(3)主 Activity

MainActivity.java

package com.zhyan8.aidl_c;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.zhyan8.aidl.MessageManager;public class MainActivity extends AppCompatActivity {    private MessageManager mMessageManager;    private EditText et_msg;    private Button btn_send;    private TextView tv_msg;    private Button btn_recv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    public void init() {        et_msg = (EditText) findViewById(R.id.et_msg);        btn_send = (Button) findViewById(R.id.btn_send);        tv_msg = (TextView) findViewById(R.id.tv_msg);        btn_recv = (Button) findViewById(R.id.btn_recv);        btn_send.setOnClickListener(cl);        btn_recv.setOnClickListener(cl);    }    View.OnClickListener cl = new View.OnClickListener(){        @Override        public void onClick(View v) {            if (v.getId()==R.id.btn_send) {                String str = et_msg.getText().toString();                sendMsg(str);            }else if(v.getId()==R.id.btn_recv) {                String str = getMsg();                tv_msg.setText(str);            }        }    };    private void sendMsg(String str){        if (mMessageManager==null) {            attemptToBindService();        }        try {            mMessageManager.sendMsg(str);        } catch (RemoteException e) {            e.printStackTrace();        }    }    private String getMsg(){        if (mMessageManager==null) {            attemptToBindService();        }        try {            String str = mMessageManager.getMsg();            return str;        } catch (RemoteException e) {            e.printStackTrace();        }        return "";    }    private void attemptToBindService() {        Intent intent = new Intent();        intent.setAction("com.xxx.aidl");        intent.setPackage("com.zhyan8.aidl_s");        bindService(intent, conn, Context.BIND_AUTO_CREATE);    }    ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            mMessageManager = MessageManager.Stub.asInterface(service);        }        @Override        public void onServiceDisconnected(ComponentName name) {            mMessageManager = null;        }    };    @Override    protected void onStart() {        super.onStart();        if (mMessageManager==null) {            attemptToBindService();        }    }    @Override    protected void onStop() {        super.onStop();        if (mMessageManager!=null) {            unbindService(conn);        }    }}

注意:intent.setPackage("com.zhyan8.aidl_s") 中的 "com.zhyan8.aidl_s" 应与服务端 aidl_S 的 build.gradle 中 applicationId 属性的值一致,如下:

Android——使用AIDL实现进程间通讯简单案例_第4张图片

5 效果展示

(1)发送消息

在 EditView 中输入【Qwert】,点击【发送】按钮,在服务端可以收到发送的消息,如下:

(2)接收消息

点击【接收】按钮,客户端 aidl_C 界面可以看到服务端 aidl_S 传过来的字符串【abcde】,如下:

Android——使用AIDL实现进程间通讯简单案例_第5张图片

更多相关文章

  1. Android中单APK应用多进程
  2. 初遇Android——跨进程使用Service
  3. Android开发规范:API接口通用设计规范
  4. Android 无线接口层(Radio Layer Interface)
  5. Android 打开本地pdf文件,android 加载pdf文件
  6. Android Manifest文件
  7. Android 中.aar文件生成方法与用法
  8. Android文件存取

随机推荐

  1. Android(安卓)ANR keyDispatchingTimedOu
  2. Please ensure that adb is correctly lo
  3. android 读取 attr 资源
  4. 搜集的android资源
  5. 用Socket实现PC和手机的文件传输
  6. Android开机启动动画
  7. Android(安卓)几种图像特效处理的集锦
  8. Android中查找联系人常用的URI
  9. [Android]ListView小技巧
  10. Android(安卓)Studio 单独编译WebRTC的 v