iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >详解Android中AIDL的使用
  • 631
分享到

详解Android中AIDL的使用

2024-04-02 19:04:59 631人浏览 安东尼
摘要

aiDL,即Android Interface Definition Language,Android接口定义语言。这门语言是为了实现进程间通信。每一个进程都有自己的一块独立的内存,

aiDL,即Android Interface Definition Language,Android接口定义语言。这门语言是为了实现进程间通信。每一个进程都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行自己的操作,每个进程之间你不知我,我不知你,而AIDL,就是两个进程之间沟通的桥梁。

AIDL用来做什么

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

aidl文件支持的数据类型包括:

  • 八种基本数据类型:byte、char、short、int、long、float、double、boolean
  • String、CharSequence
  • 实现了Parcelable接口的数据类型
  • List类型。List承载的数据必须是AIDL支持的类型,或者是其他声明的AIDL对象
  • Map类型。Map承载的数据必须是AIDL支持的类型,或者是其他声明的AIDL对象

在使用其他声明的AIDL对象的时候必须要导包,即使要使用的AIDL对象文件和当前正在编辑的aidl文件在同一个文件夹下。

aidl文件可以分为两类,一类用来声明实现了Parcelable接口的数据类型,以供其他AIDL文件使用那些非默认支持的数据类型。还有一类是用来定义接口方法,声明要暴露哪些接口给客户端调用。

AIDL的具体使用步骤是:

一、创建一个服务端工程

1、如果aidl文件中涉及到实现了Parcelable接口的数据类型,则先将该aidl文件定义出来。在src文件夹下右键,选择新建aidl文件,这里新建了一个Book.aidl文件。

新建完以后,会在main文件下生成一个aidl的文件夹,aidl文件夹下的目录结构和java文件夹下的目录结构一样。

Book.aidl文件中会有一个默认方法。

我们删除掉这个默认方法,只声明一个parcelable数据类型,这个文件就成为声明Parcelable数据类型的AIDL文件。注意这里的parcelable中的p是小写的。

2、这个时候我们来定义Book类并实现Parcelable接口,注意Book类在java文件夹下的目录与Book.aidl文件在aidl文件夹下的目录保持一致。


public class Book implements Parcelable {
 
    private String name;
 
    public Book(String name) {
        this.name=name;
    }
 
    protected Book(Parcel in) {
        this.name = in.readString();
    }
 
    public static final Creator<Book> CREATOR = new Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }
 
        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
    }
 
    
    public void readFromParcel(Parcel dest){
        name=dest.readString();
    }
}

这里需要注意的一点是如果要支持为out或inout的定向tag的话,需要我们手写readFromParcel()方法。

3、然后我们开始写BookController.aidl文件来定义能被客户端调用的接口。


package com.example.service;
 
import com.example.service.Book;
 
// Declare any non-default types here with import statements
 
interface BookController {
 
    int getInt();//int类型
    String getString();//String类型
    List<Book> getBookList();//aidl对象
    void addBook(inout Book book);//aidl对象
 
}

这里需要注意的是,虽然Book.aidl文件和BookController.aidl文件在同一个包下,还是需要手动导入一下。

4、至此,我们的aidl文件写完了,然后我们Rebuild project,系统会帮我们生成一个与AIDL文件同名的java文件,这个java文件才是与我们跨进程通信密切相关的东西。

5、定义一个Service,通过这个Service将接口暴露给外部。


public class AIDLService extends Service {
 
    private List<Book> bookList;
 
    public AIDLService() {
 
    }
 
    @Override
    public void onCreate() {
        super.onCreate();
        bookList = new ArrayList<>();
        initData();
    }
 
    private void initData() {
        Book book1 = new Book("花千骨");
        Book book2 = new Book("公主小妹");
        Book book3 = new Book("仙剑奇侠传");
        Book book4 = new Book("飘");
        Book book5 = new Book("茶花女");
        Book book6 = new Book("解忧杂货铺");
        Book book7 = new Book("活着");
        Book book8 = new Book("三生三世十里桃花");
        bookList.add(book1);
        bookList.add(book2);
        bookList.add(book3);
        bookList.add(book4);
        bookList.add(book5);
        bookList.add(book6);
        bookList.add(book7);
        bookList.add(book8);
    }
 
    private final BookController.Stub stub = new BookController.Stub() {
        @Override
        public int getInt() throws RemoteException {
            return bookList == null ? 0 : bookList.size();
        }
 
        @Override
        public String getString() throws RemoteException {
            return bookList == null ? "" : bookList.get(0).getName();
        }
 
        @Override
        public List<Book> getBookList() throws RemoteException {
            return bookList;
        }
 
        @Override
        public void addBook(Book book) throws RemoteException {
            if (book != null) {
                bookList.add(book);
            } else {
                Log.i("ruxing", "接收到了一个空对象 Inout");
            }
        }
    };
 
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }
}

6、在清单文件中注册服务。


  <service android:name=".AIDLService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.service.action"/>
                <cateGory android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>

至此,服务端开发完成了。

二、创建一个custom工程

1、新建一个custom工程,把服务端的aidl文件夹下的内容全部拷贝到新项目中,如果aidl中有用到bean实体类,把实体类也拷贝过来,然后Rebuild Project。

2、在客户端的activity中连接远程服务,实现aidl通信。


public class MainActivity extends AppCompatActivity {
 
    private BookController bookController;
    private boolean connected;
    private List<Book> bookList;
 
    private Button mBtnGetBookList;
    private Button mBtnAddBook;
    private Button mBtnGetBookSize;
    private Button mBtnGetFirstBookName;
 
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            bookController = BookController.Stub.asInterface(service);
            connected = true;
        }
 
        @Override
        public void onServiceDisconnected(ComponentName name) {
            bookController = null;
            connected = false;
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mBtnGetBookList = findViewById(R.id.btn_get_book_list);
        mBtnAddBook = findViewById(R.id.btn_add);
        mBtnGetBookSize = findViewById(R.id.btn_get_book_size);
        mBtnGetFirstBookName = findViewById(R.id.btn_first_book_name);
 
        mBtnGetBookList.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (connected) {
                    try {
                        bookList = bookController.getBookList();
                        for (int i = 0; i < bookList.size(); i++) {
                            Log.i("ruxing", "name=" + bookList.get(i).getName());
                        }
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        mBtnAddBook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (connected) {
                    Book book = new Book("新书");
                    try {
                        bookController.addBook(book);
                        Log.i("ruxing", "向服务器添加了一本新书==="+book.getName());
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        mBtnGetBookSize.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (connected) {
                    try {
                        int size = 0;
                        size = bookController.getInt();
                        Log.i("ruxing", "共有" + size + "本书");
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        mBtnGetFirstBookName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (connected) {
                    try {
                        String name = bookController.getString();
                        Log.i("ruxing", "第一本书的书名是:" + name);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
 
        Intent intent = new Intent();
        intent.setPackage("com.example.service");
        intent.setAction("com.example.service.action");
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
 
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (connected) {
            unbindService(serviceConnection);
        }
    }
}

完整的代码地址:

https://GitHub.com/ruxing1102/AIDL.git

到此这篇关于Android中AIDL的使用的文章就介绍到这了,更多相关Android AIDL使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Android中AIDL的使用

本文链接: https://www.lsjlt.com/news/129941.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Android中AIDL的使用
    AIDL,即Android Interface Definition Language,Android接口定义语言。这门语言是为了实现进程间通信。每一个进程都有自己的一块独立的内存,...
    99+
    2024-04-02
  • Android AIDL 使用详解
    目录 一、概述 二、语法 一、概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于I...
    99+
    2023-10-03
    android java android studio
  • 详解Android中Service AIDL的使用
    目录前言Service基本用法——本地服务远程服务 —— AIDL服务端客户端前言 有些朋友可能是从事开发工作的时间不是特别的长,所以觉得Service相对与另外两个组件activi...
    99+
    2024-04-02
  • 一文详解在Android中Service和AIDL的使用
    目录Service 和 AIDL 的使用1. Service1.1 Service 的基本生命周期1.1.1 startService1.1.2 bindService1.2 Ser...
    99+
    2023-05-18
    Android Service和AIDL的使用 Android Service使用 Android AIDL使用
  • Android中AIDL的简单使用(Hello world)
    AIDL:Android Interface Definition Language(Android接口定义语言) 作用:跨进程通讯。如A应用调用B应用提供的接口 代码实现过程简述: A应用创建aidl接口,并且创建一个Service来实...
    99+
    2023-09-07
    android android studio aidl hello world 简单使用
  • Android AIDL基本使用
    AIDL是Android多进程通讯方式一种。 如要使用 AIDL 创建绑定服务,请执行以下步骤: 创建 .aidl 文件 此文件定义带有方法签名的编程接口。 实现接口 Android SDK 工具会基于您的 .aidl 文件,使用 Java...
    99+
    2023-09-04
    android
  • Android中AIDL怎么用
    这篇文章主要介绍Android中AIDL怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!AIDL,即Android Interface Definition Language,Android接口定义语言。这门语言...
    99+
    2023-06-20
  • 详解Android跨进程通信之AIDL
    需求描述 进程A调起第三方进程B进行第三方登录 – 实现双向通信 代码(进程A) 1.目录结构 2.LoginActivity.java public class LoginA...
    99+
    2024-04-02
  • Android 创建AIDL文件使用教程
    目录前言1 创建 AIDL 文件2 实现接口3 服务端公开接口4 客户端调用 IPC 方法5 通过 IPC 传递对象前言 AIDL(Android Interface Definit...
    99+
    2024-04-02
  • 解析Android AIDL的实例与原理
    目录一、概述二、创建 .aidl 文件三、生成 .java 文件四、传输复杂数据五、建立 service六、获取服务七、分析调用过程一、概述 简单来说,AIDL 就是定义一个接口,客...
    99+
    2024-04-02
  • Android中PreferenceFragment的使用详解
    目录PreferenceFragment简介PreferenceFragment使用PreferenceFragment 扩展PreferenceFragment简介 在我们写一个...
    99+
    2024-04-02
  • 详解Android中motion_toast的使用
    目录前言motion_toast 介绍示例最简单用法其他内置的提醒自定义 toast总结前言 我们通常会用 toast(也叫吐司)来显示提示信息,例如网络请求错误,校验错误等等。大多...
    99+
    2024-04-02
  • 怎么在Android中使用AIDL实现进程间通信
    怎么在Android中使用AIDL实现进程间通信?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、概述AIDL 意思即 Android Interface Definiti...
    99+
    2023-05-30
    android aidl
  • Android中PreferenceActivity使用详解
    目录一,Preference介绍二,PreferencesActivity介绍三,PreferenceActivity的使用四,PreferenceActivity分别和ListFr...
    99+
    2024-04-02
  • Android中PackageManager使用详解
    目录前言引入:AndroidManifest.xml文件节点说明:相关类的介绍PackageManger 类PackageInfo类  PackageItemInfo类Applica...
    99+
    2024-04-02
  • 【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例
    Binder介绍 Android 中的 Binder 是一个进程间通信机制,它允许不同进程之间相互调用方法和传递数据。Binder 主要用于实现系统服务和应用程序之间的通信,以及实现 IPC(Inte...
    99+
    2023-09-03
    android binder 网络
  • Android中的OpenGL使用配置详解
    目录引言介绍GLSurfaceViewEGL配置渲染setDebugFlags和setGLWrapper渲染器Renderer坐标映射绘制三角形绘制效果引言 PS:虽然感觉好久没更...
    99+
    2023-02-28
    Android OpenGL配置 Android OpenGL
  • Android 中RxPermissions 的使用方法详解
    Android 中RxPermissions 的使用方法详解以请求拍照、读取位置权限为例module的build.gradle: compile 'com.tbruyelle.rxpermissions2:rxpermissions:0....
    99+
    2023-05-30
    android rxpermissions mi
  • Android 中Context的使用方法详解
    Android 中Context的使用方法详解概要:Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄。很多方法...
    99+
    2023-05-30
    android context roi
  • 详解Android Handler的使用
    目录Handler概要构造器sendMessageAtTimedispatchMessageThreadLocalLooperMessageQueueIdleHandlerAsync...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作