iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Android中AIDL怎么用
  • 266
分享到

Android中AIDL怎么用

2023-06-20 14:06:53 266人浏览 薄情痞子
摘要

这篇文章主要介绍Android中aiDL怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!AIDL,即Android Interface Definition Language,Android接口定义语言。这门语言

这篇文章主要介绍AndroidaiDL怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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的具体使用步骤是:

一、创建一个服务端工程

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

Android中AIDL怎么用

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

Android中AIDL怎么用

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

Android中AIDL怎么用

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

Android中AIDL怎么用

这个时候我们来定义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()方法。

然后我们开始写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文件在同一个包下,还是需要手动导入一下。

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

定义一个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;    }}

在清单文件中注册服务。

  <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工程

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

Android中AIDL怎么用

在客户端的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);        }    }}

以上是“Android中AIDL怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android中AIDL怎么用

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

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

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

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

下载Word文档
猜你喜欢
  • Android中AIDL怎么用
    这篇文章主要介绍Android中AIDL怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!AIDL,即Android Interface Definition Language,Android接口定义语言。这门语言...
    99+
    2023-06-20
  • Android AIDL 使用详解
    目录 一、概述 二、语法 一、概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于I...
    99+
    2023-10-03
    android java android studio
  • 详解Android中AIDL的使用
    AIDL,即Android Interface Definition Language,Android接口定义语言。这门语言是为了实现进程间通信。每一个进程都有自己的一块独立的内存,...
    99+
    2024-04-02
  • Android AIDL基本使用
    AIDL是Android多进程通讯方式一种。 如要使用 AIDL 创建绑定服务,请执行以下步骤: 创建 .aidl 文件 此文件定义带有方法签名的编程接口。 实现接口 Android SDK 工具会基于您的 .aidl 文件,使用 Java...
    99+
    2023-09-04
    android
  • 详解Android中Service AIDL的使用
    目录前言Service基本用法——本地服务远程服务 —— AIDL服务端客户端前言 有些朋友可能是从事开发工作的时间不是特别的长,所以觉得Service相对与另外两个组件activi...
    99+
    2024-04-02
  • 怎么在Android中使用AIDL实现进程间通信
    怎么在Android中使用AIDL实现进程间通信?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、概述AIDL 意思即 Android Interface Definiti...
    99+
    2023-05-30
    android aidl
  • AIDL文件怎么在Android Studio项目中创建
    AIDL文件怎么在Android Studio项目中创建?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Android系统中,跨进程通信是非常普遍的事情,它用到了Binde...
    99+
    2023-05-31
    android studio 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文件使用教程
    目录前言1 创建 AIDL 文件2 实现接口3 服务端公开接口4 客户端调用 IPC 方法5 通过 IPC 传递对象前言 AIDL(Android Interface Definit...
    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使用
  • Flutter的AIDL怎么定义
    本篇内容介绍了“Flutter的AIDL怎么定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flutte...
    99+
    2024-04-02
  • Android AIDL通信DeadObjectException解决方法是什么
    这篇文章主要介绍了Android AIDL通信DeadObjectException解决方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android AIDL通信DeadObjec...
    99+
    2023-07-05
  • 【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例
    Binder介绍 Android 中的 Binder 是一个进程间通信机制,它允许不同进程之间相互调用方法和传递数据。Binder 主要用于实现系统服务和应用程序之间的通信,以及实现 IPC(Inte...
    99+
    2023-09-03
    android binder 网络
  • Android中NotificationListenerService怎么用
    这篇文章主要介绍了Android中NotificationListenerService怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用新建一服务类,使它继承Noti...
    99+
    2023-05-31
    android
  • Android中relativelayout.layoutparams怎么用
    RelativeLayout.LayoutParams 是 RelativeLayout 的子类,用于设置子视图在 Relative...
    99+
    2024-02-29
    Android
  • Android中Gson怎么用
    小编给大家分享一下Android中Gson怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. 导入Android Studio工程dependencies {    ...
    99+
    2023-06-25
  • Android中TextView怎么用
    这篇文章给大家分享的是有关Android中TextView怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。XML的几个特殊属性 android:autoLink 用于指定是否将文本转换成可点击的超链接形式,它...
    99+
    2023-05-30
    android textview
  • Android中AssetManager怎么使用
    在Android中,AssetManager类用于访问应用程序的assets目录中的文件。可以通过以下步骤使用AssetManage...
    99+
    2023-09-26
    Android AssetManager
  • Android中dialoginterface怎么使用
    在Android中,DialogInterface是一个接口,用于处理对话框的按钮点击事件。可以通过以下步骤使用DialogInte...
    99+
    2023-08-11
    Android dialoginterface
  • Android中ListView怎么使用
    这篇文章主要讲解了“Android中ListView怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android中ListView怎么使用”吧!一、具体思路1、创建Listview控...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作