Android AIDL跨进程通信基础(多端情况)
创始人
2024-02-10 15:58:35

简介

AIDL建议在来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL,其他情况下你都可以选择其他方法,如使用 Messenger,也能跨进程通信。可见 AIDL 是处理多线程、多客户端并发访问的,而 Messenger 是单线程处理。
下面介绍 AIDL 的使用方法。

AIDL 文件可以分为两类。一类用来声明实现了 Parcelable 接口的数据类型,以供其他 AIDL 文件使用那些非默认支持的数据类型。还有一类是用来定义接口方法,声明要暴露哪些接口给客户端调用。在 AIDL 文件中需要明确标明引用到的数据类型所在的包名,即使两个文件处在同个包名下。

默认情况下,AIDL 支持下列数据类型:

  • 八种基本数据类型:byte、char、short、int、long、float、double、boolean
    String,CharSequence

  • List类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象

  • Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象

服务端目录结构与相关代码

在这里插入图片描述

  • 创建Book数据类,跨进程传递对象需将对象序列化处理
package com.example.aidl_server.aidl;import android.os.Parcel;
import android.os.Parcelable;public class Book implements Parcelable {private String name;protected Book(Parcel in) {name = in.readString();}public static final Creator CREATOR = new Creator() {@Overridepublic Book createFromParcel(Parcel in) {return new Book(in);}@Overridepublic Book[] newArray(int size) {return new Book[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +'}';}
}
  • Book对应的AIDL文件代码内容
package com.example.aidl_server.aidl;parcelable Book;

注意,这里Book.java与Book.aidl里package一定要一致,不然后面build时会报错,无法生成相关接口代码。

  • 对客户端提供接口方法的aidl代码,此文件与Book.aidl在同一路径下
// IBookInterface.aidl
package com.example.aidl_server.aidl;import com.example.aidl_server.aidl.Book;// Declare any non-default types here with import statementsinterface IBookInterface {void addBook(in Book book);List getBooks();/*** 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);
}

创建完成后build一下代码,build成功的话可以在此路径下看见生成的java代码
在这里插入图片描述

  • 创建服务BookService
package com.example.aidl_server;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;import androidx.annotation.Nullable;import com.example.aidl_server.aidl.Book;
import com.example.aidl_server.aidl.IBookInterface;import java.util.ArrayList;
import java.util.List;public class BookService extends Service {private IBookInterface.Stub binder = new IBookInterface.Stub() {private List books = new ArrayList<>();@Overridepublic void addBook(Book book) throws RemoteException {if (book != null) {books.add(book);Log.e("BookService", "添加书籍成功 ++++ " + book.toString());}}@Overridepublic List getBooks() throws RemoteException {Log.e("BookService", "获取书籍,数目为 = " + books.size());return books;}@Overridepublic void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {}};@Nullable@Overridepublic IBinder onBind(Intent intent) {return binder;}
}
  • 服务端清单文件内注册此服务
		

服务端准备工作完成,接下来看一下客户端如何操作

客户端连接服务并且进行数据交互

1. 先将服务端aidl文件夹完整的复制过来,包名要与服务端保持一致
2. 将服务端Book文件复制到客户端,包名要与服务端一致
3. build代码

客户端目录结果如下图

在这里插入图片描述

  • 创建连接并且绑定服务
package com.example.aidl_client;import androidx.appcompat.app.AppCompatActivity;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.view.View;
import android.widget.TextView;
import android.widget.Toast;import com.example.aidl_server.aidl.Book;
import com.example.aidl_server.aidl.IBookInterface;import java.util.List;public class ClientActivity extends AppCompatActivity {private IBookInterface iBookInterface;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {iBookInterface = IBookInterface.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_client);// 绑定服务Intent intent = new Intent();intent.setAction("com.example.aidl_server.jiao");intent.setPackage("com.example.aidl_server");bindService(intent, connection, Context.BIND_AUTO_CREATE);TextView bookShow = findViewById(R.id.show_book_name);// 点击添加书籍findViewById(R.id.add_book).setOnClickListener(v -> {long millis = System.currentTimeMillis();Book book = new Book("书籍" + millis);try {iBookInterface.addBook(book);Toast.makeText(getApplicationContext(), "添加成功", Toast.LENGTH_LONG).show();} catch (Exception e) {e.printStackTrace();Toast.makeText(getApplicationContext(), "添加失败", Toast.LENGTH_LONG).show();}});// 点击显示书籍findViewById(R.id.get_book).setOnClickListener(v -> {try {List books = iBookInterface.getBooks();if (books != null) {if (books.size() == 0) {bookShow.setText("书记数目为0");} else {bookShow.setText(books.toString());}}} catch (Exception e) {e.printStackTrace();}});}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(connection);}
}

客户端布局相关代码



  • 点击按钮进行操作服务端结果打印如下
    在这里插入图片描述
    end

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...