java或者kotlin 代码使用AIDL 技术实现一个服务端可以接收来自多个不同的APP客户端的请求,要区分来自哪一个客户端app的什么类型请求,把请求加入任务栈,任务栈用一个单独的类TaskStack来管理,任务和注册的回调消息绑定。在一个子线程中while循环取出任务栈中的任务,有一个Dispach类来管理任务的分发,在Dispach类中按照请求的优先级同步或者异步的将任务分发执行,执行完成后通过Dispach把消息回调给发请求的那个客户端app,给出详细的每一个类的代码
时间: 2024-03-27 18:37:07 浏览: 106
AIDL实现客户端和服务端的双向通信
以下是Java代码实现:
首先,定义AIDL接口文件TaskManagerService.aidl,定义请求类型(RequestType)和回调接口(ITaskCallback):
```
// TaskManagerService.aidl
package com.example.taskmanager;
import com.example.taskmanager.ITaskCallback;
interface TaskManagerService {
void addTask(int requestType, String taskContent, ITaskCallback callback);
}
```
然后,实现TaskManagerService接口:
```
// TaskManagerService.java
package com.example.taskmanager;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class TaskManagerService extends Service {
private static final String TAG = "TaskManagerService";
// 存储任务栈
private Map<String, TaskStack> mTaskStackMap = new ConcurrentHashMap<String, TaskStack>();
// 实现TaskManagerService接口
private final ITaskManagerService.Stub mBinder = new ITaskManagerService.Stub() {
@Override
public void addTask(int requestType, String taskContent, ITaskCallback callback) throws RemoteException {
// 获取调用addTask的客户端包名
String packageName = getPackageManager().getNameForUid(Binder.getCallingUid());
// 获取TaskStack,如果不存在则创建
TaskStack taskStack = mTaskStackMap.get(packageName);
if (taskStack == null) {
taskStack = new TaskStack();
mTaskStackMap.put(packageName, taskStack);
}
// 新建任务
Task task = new Task(requestType, taskContent, callback);
// 加入任务栈
taskStack.add(task);
}
};
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "TaskManagerService onCreate");
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "TaskManagerService onBind");
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "TaskManagerService onDestroy");
}
}
```
接下来,定义Task、TaskStack、Dispatch、RequestType和ITaskCallback:
```
// Task.java
package com.example.taskmanager;
public class Task {
public int requestType;
public String taskContent;
public ITaskCallback callback;
public Task(int requestType, String taskContent, ITaskCallback callback) {
this.requestType = requestType;
this.taskContent = taskContent;
this.callback = callback;
}
}
// TaskStack.java
package com.example.taskmanager;
import java.util.LinkedList;
import java.util.Queue;
public class TaskStack {
// 任务队列
private Queue<Task> mTaskQueue = new LinkedList<Task>();
// 添加任务到队列
public void add(Task task) {
mTaskQueue.offer(task);
}
// 获取队列头部任务
public Task getTopTask() {
return mTaskQueue.peek();
}
// 删除队列头部任务
public void removeTopTask() {
mTaskQueue.poll();
}
// 是否为空
public boolean isEmpty() {
return mTaskQueue.isEmpty();
}
}
// Dispatch.java
package com.example.taskmanager;
import android.os.Handler;
import android.os.Looper;
public class Dispatch {
private Handler mHandler = new Handler(Looper.getMainLooper());
// 分发任务
public void dispatch(Task task) {
if (task.requestType == RequestType.TYPE_SYNC) {
// 同步执行
execute(task);
} else {
// 异步执行
new Thread(new Runnable() {
@Override
public void run() {
execute(task);
}
}).start();
}
}
// 执行任务
private void execute(Task task) {
// 执行任务并获取结果
String result = "Task result";
// 回调结果
try {
task.callback.onResult(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// RequestType.java
package com.example.taskmanager;
public class RequestType {
public static final int TYPE_SYNC = 1; // 同步请求
public static final int TYPE_ASYNC = 2; // 异步请求
}
// ITaskCallback.aidl
package com.example.taskmanager;
// 回调接口,定义在ITaskCallback.aidl文件中
interface ITaskCallback {
void onResult(String result);
}
```
最后,客户端调用TaskManagerService的addTask方法:
```
// 客户端代码
private void addTask(int requestType, String taskContent) {
try {
TaskManagerServiceManager.getInstance().getService().addTask(requestType, taskContent, new ITaskCallback.Stub() {
@Override
public void onResult(String result) throws RemoteException {
// 处理回调结果
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}
```
其中,TaskManagerServiceManager是一个单例类,用于绑定和解绑TaskManagerService。
阅读全文