java或者kotlin 代码使用AIDL 技术实现一个服务端可以接收来自多个不同的APP客户端的请求,要区分来自哪一个客户端app的什么类型请求,把请求加入任务栈,任务栈用一个单独的类TaskStack来管理,任务和注册的回调消息绑定。在一个子线程中while循环取出任务栈中的任务,有一个Dispach类来管理任务的分发,在Dispach类中按照请求的优先级同步或者异步的将任务分发执行,执行完成后通过Dispach把消息回调给发请求的那个客户端app,给出详细的每一个类的代码
时间: 2024-03-27 16:37:11 浏览: 64
AIDL实现客户端和服务端的双向通信
首先,我们需要创建一个AIDL接口文件,用于定义客户端和服务端之间的通信协议。以下是一个简单的示例:
```
// ITaskManager.aidl
package com.example.taskmanager;
import java.util.List;
interface ITaskManager {
void addTask(Task task);
List<Task> getTaskList();
void registerCallback(ITaskCallback callback);
void unregisterCallback(ITaskCallback callback);
}
```
接下来,我们需要创建一个服务端的实现类`TaskManagerService`,该类实现了上面定义的接口。以下是该类的代码:
```
// TaskManagerService.java
package com.example.taskmanager;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class TaskManagerService extends Service {
private static final String TAG = "TaskManagerService";
private List<Task> mTaskList = new ArrayList<>();
private List<ITaskCallback> mCallbacks = new ArrayList<>();
private TaskStack mTaskStack = new TaskStack();
private Dispatch mDispatch = new Dispatch();
private final ITaskManager.Stub mBinder = new ITaskManager.Stub() {
@Override
public void addTask(Task task) throws RemoteException {
Log.d(TAG, "addTask: " + task.toString());
task.setApp(getCallingApp()); // 获取请求的客户端app
mTaskStack.addTask(task); // 把任务加入任务栈
}
@Override
public List<Task> getTaskList() throws RemoteException {
Log.d(TAG, "getTaskList");
return mTaskStack.getTaskList(); // 获取任务栈中的任务列表
}
@Override
public void registerCallback(ITaskCallback callback) throws RemoteException {
Log.d(TAG, "registerCallback");
mCallbacks.add(callback); // 注册回调
}
@Override
public void unregisterCallback(ITaskCallback callback) throws RemoteException {
Log.d(TAG, "unregisterCallback");
mCallbacks.remove(callback); // 取消注册回调
}
};
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return mBinder;
}
// 获取请求的客户端app
private String getCallingApp() {
String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
if (packages != null && packages.length > 0) {
return packages[0];
}
return null;
}
// 执行任务
private void executeTask(Task task) {
Log.d(TAG, "executeTask: " + task.toString());
mTaskStack.removeTask(task); // 从任务栈中移除任务
mDispatch.dispatchTask(task); // 分发任务执行
for (ITaskCallback callback : mCallbacks) {
try {
callback.onTaskFinished(task); // 回调任务执行结果
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
// 任务栈类
private class TaskStack {
private List<Task> mTaskList = new ArrayList<>();
public void addTask(Task task) {
mTaskList.add(task);
}
public List<Task> getTaskList() {
return mTaskList;
}
public void removeTask(Task task) {
mTaskList.remove(task);
}
}
// 分发器类
private class Dispatch {
public void dispatchTask(Task task) {
// 根据任务的优先级同步或异步执行任务
}
}
}
```
最后,我们需要创建一个任务类`Task`和一个回调接口`ITaskCallback`,用于表示客户端发送的请求和服务端的回调。以下是这两个类的代码:
```
// Task.java
package com.example.taskmanager;
public class Task {
private String mApp;
private int mPriority;
private String mData;
public Task(String app, int priority, String data) {
mApp = app;
mPriority = priority;
mData = data;
}
public String getApp() {
return mApp;
}
public void setApp(String app) {
mApp = app;
}
public int getPriority() {
return mPriority;
}
public String getData() {
return mData;
}
@Override
public String toString() {
return "Task{" +
"app='" + mApp + '\'' +
", priority=" + mPriority +
", data='" + mData + '\'' +
'}';
}
}
```
```
// ITaskCallback.aidl
package com.example.taskmanager;
interface ITaskCallback {
void onTaskFinished(Task task);
}
```
以上就是一个使用AIDL技术实现的服务端,它可以接收来自多个不同的APP客户端的请求,区分来自哪一个客户端app的什么类型请求,把请求加入任务栈,并通过回调消息把执行结果返回给发请求的那个客户端app。
阅读全文