没有合适的资源?快使用搜索试试~ 我知道了~
首页Android 使用AIDL进行两个APP之间通讯以及相互消息回调(一)
前言: AIDL:Android Interface Definition Language,翻译过来就是Android接口定义语言。是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于IPC的代码。所以使用AIDL需要一个服务端和客户端 作用:可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。 1.AIDL支持的基本数据类型 八种基本数据类型:byte、char、short、int、long、float、double、boolean String,CharSequence 实现了Parcelable接口的数据类型 List 类型。List
资源详情
资源评论
资源推荐

Android 使用使用AIDL进行两个进行两个APP之间通讯以及相互消息回调之间通讯以及相互消息回调
(一一)
前言:前言:
AIDL:Android Interface Definition Language,翻译过来就是Android接口定义语言。是用于定义服务器和客户端通信接口的
一种描述语言,可以拿来生成用于IPC的代码。所以使用AIDL需要一个服务端和客户端
作用:可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。
1.AIDL支持的基本数据类型支持的基本数据类型
八种基本数据类型:byte、char、short、int、long、float、double、boolean
String,CharSequence
实现了Parcelable接口的数据类型
List 类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
2.服务端的实现服务端的实现
创建工程,以及所需创建工程,以及所需aidl文件文件
使用Android Studio新建一个工程,命名为TestAidlDemo1
右键New一个AIDL文件,取名为IAidlInterface,AS会自动在工程目录生成一个路径完全一样的aidl文件夹

既然是要回调消息,那就还需要一个回调接口,同样的方法,创建IAidlCallBack.aidl文件,那么接下来就进行代码编写
实现代码逻辑实现代码逻辑
编写IAidlInterface.aldi代码,因为我们需要回调消息,那么我们需要注册回调以及注销回调接口,一个发送消息的接口,一个
获取历史消息的接口,代码如下(AIDL文件不会自动导包,一些不是基本支持数据类型需要我们自己手动import,)
import com.pgc.testaidldemo1.IAidlCallBack;
interface IAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void registerCallBack(IAidlCallBack iAidlCallBack);
void unregisterCallBack(IAidlCallBack iAidlCallBack);
void sendMessage(String message);
List getMessages();
}
编写IAidlCallBack.aidl代码:既然是回调接口,那么我们只需要一个消息发送成功的回调接口就行,代码如下
interface IAidlCallBack {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void onMessageSuccess(String message);
}

既然是服务端,我们需要实现接收消息已经处理消息的逻辑代码,所以我们创建一个AidlService,继承Service,因为Service不
能直接接收Callback,但是提供了RemoteCallbackList来注册回调
private RemoteCallbackList callbackList= new RemoteCallbackList();
同时RemoteCallbackList提供了beginBroadcast来获取当前注册的回调数,因此我们可以通过这个方法进行回调处理(再使用
了beginBroadcast之后必须调用finishBroadcast不然会报beginBroadcast() called while already in a broadcast错误)
final int num=callbackList.beginBroadcast();
for (int i=0;i<num;i++){
IAidlCallBack iAidlCallBack=callbackList.getBroadcastItem(i);
iAidlCallBack.onMessageSuccess(message);
}
callbackList.finishBroadcast();
接下来实例化binder对象并返回给客户端,
@Override
public IBinder onBind(Intent intent) {
return binder;
}
private final IAidlInterface.Stub binder=new IAidlInterface.Stub() {
@Override
public void registerCallBack(IAidlCallBack iAidlCallBack) throws RemoteException {
callbackList.register(iAidlCallBack);
}
@Override
public void unregisterCallBack(IAidlCallBack iAidlCallBack) throws RemoteException {
callbackList.unregister(iAidlCallBack);
}
@Override
public void sendMessage(String message) throws RemoteException {
messages.add(message);
final int num=callbackList.beginBroadcast();
for (int i=0;i<num;i++){
IAidlCallBack iAidlCallBack=callbackList.getBroadcastItem(i);
iAidlCallBack.onMessageSuccess(message);
}
callbackList.finishBroadcast();
}
@Override
public List getMessages() throws RemoteException {
return messages;
}
};
在AndroidManifest.xml注册Service
AidlService全部代码
package com.pgc.testaidldemo1;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import androidx.annotation.Nullable;
import java.util.ArrayList;
剩余10页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0