Android AIDL Callback的使用(配源码)

news/2024/11/25 14:53:38/

零、示例说明

本示例,完成的功能是:客户端向服务端注册一个回调,服务端是一个商店shop,当商店里的产品 Product 有变化时,调用回调向通知客户端,什么商品更新了。

一、完整源代码

完整源码链接: https://github.com/jx0260/TestGradle

二、实现步骤

2.1 定义实体

定义 Product.aidl

// Product.aidl
package com.example.testgradle;// Declare any non-default types here with import statementsparcelable Product;

对应的实体类:

package com.example.testgradle;import android.os.Parcel;
import android.os.Parcelable;public class Product implements Parcelable {private String no;private String name;public String getNo() {return no;}public void setNo(String no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(this.no);dest.writeString(this.name);}public void readFromParcel(Parcel source) {this.no = source.readString();this.name = source.readString();}public Product() {}protected Product(Parcel in) {this.no = in.readString();this.name = in.readString();}public static final Creator<Product> CREATOR = new Creator<Product>() {@Overridepublic Product createFromParcel(Parcel source) {return new Product(source);}@Overridepublic Product[] newArray(int size) {return new Product[size];}};
}

定义Callback AIDL,此 IShopProductCallback 将会注册到服务端去。

// IShopProductCallback.aidl
package com.example.testgradle;
import com.example.testgradle.Product;// Declare any non-default types here with import statementsinterface IShopProductCallback {oneway void onProductChanged(in Product product);
}

定义服务端 IShopAidlInterface.aidl,里面有一个registerCallback的方法

// IShopAidlInterface.aidl
package com.example.testgradle;
import com.example.testgradle.IShopProductCallback;// Declare any non-default types here with import statementsinterface IShopAidlInterface {String getProductInfo(int productNo);void buyProduct1(int productNo, String address);oneway void registerCallback(in IShopProductCallback callback);}

2.2 Make project 生成相应的 AIDL实现类

客户端:
在这里插入图片描述
服务端:
在这里插入图片描述

2.2 编写客户端

Intent serviceIntent = new Intent("com.example.testgradle.ShopService");
serviceIntent.setPackage("com.example.testgradle");
bindService(serviceIntent, new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.i(TAG, "onServiceConnected() service=" + service);iShopAidlInterface = IShopAidlInterface.Stub.asInterface(service);try {Log.i(TAG, "Client: register Stub to Server!");iShopAidlInterface.registerCallback(new IShopProductCallback.Stub() {@Overridepublic void onProductChanged(Product product) throws RemoteException {Log.i(TAG, "Client: received product changed -- " + product.getNo() + " name:" + product.getName());}});} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {}
}, BIND_AUTO_CREATE);

bindService() com.example.testgradle.ShopService ,在 onServiceConnected 回调中,使用拿到的 iShopAidlInterface 对象,调用 registerCallback,注意,此处传入的 callback 是 IShopProductCallback.Stub

public interface IShopProductCallback extends android.os.IInterface
{/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder

IShopProductCallback.Stub 继承了 Binder,实际上此处将 IShopProductCallback 的实现传进了参数,到达服务端。服务端拿到的是 IShopProductCallback.Stub.Proxy,这里就会有一种服务端变成客户端的感觉。实际上确实如此,在使用Callback的时候 服务端对于Callback来说 确实就变成了客户端,将变化的product 提交到服务端(也就是业务上的客户端)
此处,引用的“客户端”,“服务端”是有两套意思,一套是指我们总体业务的 客户端、服务端,另一套是指对于callback来说,程序实现的 客户端、服务端。

2.3 编写服务端

package com.example.testgradle;import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;import javax.security.auth.login.LoginException;public class ShopService extends Service {private String TAG = "ShopService";private IShopProductCallback mCallback;public ShopService() {}private IShopAidlInterface.Stub mBinder = new IShopAidlInterface.Stub() {@Overridepublic void registerCallback(IShopProductCallback callback) throws RemoteException {Log.i(TAG, "Server: registerCallback() this callback obj is a proxy!");mCallback = callback;mHandler.postDelayed(new Runnable() {@Overridepublic void run() {Product product = new Product();product.setNo("No.0001");product.setName("banana");try {Log.i(TAG, "Server: the proxy obj invoke onProductChanged, pass the product to the client!");mCallback.onProductChanged(product);} catch (RemoteException e) {e.printStackTrace();}}}, 20000);}};@Overridepublic IBinder onBind(Intent intent) {return mBinder;}
}

服务端 public void registerCallback(IShopProductCallback callback) 拿到客户端传来的 callback其实是一个proxy 存到mCallback 本地变量中,20秒后,创建一个变化的Product 调用 mCallback.onProductChanged(product); 将商品信息回调给客户端。

2.4 运行

日志打印:

com.example.testgradle I/ShopService: Server: registerCallback() this callback obj is a proxy!com.example.testgradle I/ShopService: Server: the proxy obj invoke onProductChanged, pass the product to the client!
com.example.clientdemo I/ClientActivity: Client: received product changed -- No.0001 name:banana

http://www.ppmy.cn/news/256403.html

相关文章

Freeswitch学习笔记(一):Sip协议

目录 1.基本概念 1.1.名词概念 1.2.SIP的基本概念和相关元素 1.3.SIP协议的基本方法和头域简介

【观察】金融行业决策智能化“换挡提速” 华为全球智慧金融峰会2023值得期待...

当前以数字化、智能化为特征的第四次工业革命正“扑面而来”&#xff0c;数字经济浪潮对各行各业都产生着深刻影响。其中&#xff0c;金融行业作为现代经济的核心&#xff0c;也面临着一系列重大的挑战和机遇。 相比于其他企业&#xff0c;金融行业依靠数据分析和智能决策更好地…

MCU 调试运行正常,去掉调试器不运行,解决方法

目录 硬件 现象 处理思路 处理过程记录 us延时准备用systick实现 实现 结论 硬件 官方评估板 现象 sdk例程 独立运行都正常。但是自己写的代码&#xff0c;调试运行正常&#xff0c;独立&#xff08;去掉调试器&#xff09;运行却不行。 处理思路 使用的代码一点点注…

PSU 19.19安装

参考文档&#xff1a; https://updates.oracle.com/Orion/Services/download?typereadme&aru25183811 OPatch lsinventory or Apply New Patch With Opatch apply Fails With Error "Unable to create patchObject" Inventory Corrupted (Doc ID 2792549.1) TFA…

为什么添加缓存要在释放锁之前?

为什么加缓存要放在释放锁之前&#xff1f; 线程拿到锁会去查缓存是否有数据&#xff0c;又因为我们向redis存入缓存数据是在释放锁之后 那么释放锁之后&#xff0c;下一个线程查缓存&#xff0c;上一个线程并未存入完成。此时就会出现查询多次数据库的情况&#xff0c;锁失效…

【大数据工具】Flink集群搭建

Flink 集群安装 1. 单机版 Flink 安装与使用 1、下载 Flink 安装包并上传至服务器 下载 flink-1.10.1-bin-scala_2.11.tgz 并上传至 Hadoop0 /software 下 2、解压 [roothadoop0 software]# tar -zxvf flink-1.10.1-bin-scala_2.11.tgz3、创建快捷方式 [roothadoop0 soft…

光机电气一体化控制实训系统

ZN-01GJD光机电气一体化控制实训系统 一、实训考核装置的构成&#xff1a; ZN-01GJD光机电气一体化控制实训系统由由铝合金导轨式实训台、典型的机电一体化设备的机械部件、PLC模块、变频器模块、按钮模块、电源模块、模拟生产设备实训模块、接线端子排和各种传感器、计算机等组…

不止Chat,GPT-4 将释放更大生产力

目录 1.对 ChatGPT 的巨大超越 2.与 ChatGPT 相同的技术路线 3.GPT-4 背后的强大阵容 4.开启多模态大模型时代 相比 ChatGPT 能力有大进化&#xff0c;多模态上有突破但不多。 近日&#xff0c;多模态大模型 GPT-4 震撼登场&#xff01; GPT-4 能够接受图像和文本输入&am…