以一个串口混杂类型为例,需要完成server端和client端
一、Server端
1、AIDL文件
创建ISerialMiscService.aidl 文件
// file:ISerialMiscService.aidl
package android.os;
import android.os.ISerialMiscServiceCallback;
interface ISerialMiscService {
void setVal(String key, String value);
String getVal(String key);
void registerCallback(ISerialMiscServiceCallback cb);
void unregisterCallback(ISerialMiscServiceCallback cb);
}
getVal和setVal可以实现同步通信,也即client端需要get一个值,它会立即返回对应的值;但是如果Server端拿到value需要一定的时间才能返回值怎么办?这时需要一个异步通信方式,或者说server端拿到value之后回调给client端。继续增加一个ISerialMiscServiceCallback.aidl文件。
// file ISerialMiscServiceCallback.aidl
package android.os;
interface ISerialMiscServiceCallback {
void serverReport(String key, int value);
}
上面的AIDL实现一个简单的callback函数,报告上层对应key和value。
2、Class文件
SerialMiscService.java实现
// File: SerialMiscService.java
package com.android.server;
import android.util.Slog;
import android.os.RemoteException;
import android.os.ISerialMiscService;
import android.os.ISerialMiscServiceCallback;
import android.os.RemoteCallbackList;
import java.util.HashMap;
public class SerialMiscService extends ISerialMiscService.Stub {
private static HashMap<String,String> mCache = null;
private static final String TAG="SerialMiscService";
final RemoteCallbackList<ISerialMiscServiceCallback> mCallbacks = new RemoteCallbackList<ISerialMiscServiceCallback>();
public SerialMiscService() {
mCache = new HashMap<>();
Slog.d(TAG, "SerialMiscService starting.");
//startCallback();
new Thread(new Runnable() {
@Override
public void run(){
while (true){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Slog.d(TAG, "startCallback");
startCallback();
}
}
}).start();
}
void startCallback() {
final int N = mCallbacks.beginBroadcast();
Slog.d(TAG, "------------------ callback hello world 123");
for (int i = 0; i < N; i++) {
try {
Slog.d(TAG, "callback hello world 123");
mCallbacks.getBroadcastItem(i).serverReport("hello world", 123);
} catch (RemoteException e){
e.printStackTrace();
}
}
mCallbacks.finishBroadcast();
}
public void setVal(String key, String value) throws RemoteException {
mCache.put(key, value);
}
public String getVal(String key) throws RemoteException {
return mCache.get(key);
}
public void registerCallback(ISerialMiscServiceCallback cb){
if (cb != null) {
mCallbacks.register(cb);
//startCallback();
}
}
public void unregisterCallback(ISerialMiscServiceCallback cb) {
if (cb != null) {
mCallbacks.unregister(cb);
}
}
}
上面类在SerialMiscService启动的时候就开启一个线程,每个三秒执行一次回调serverReport,上层client只要注册了这个callback就会每隔三秒收到一次hello world 123的消息;另外一种做法是在每次register的时候执行一次startCallback,这样可以实现每次调用的时候回调被执行,而前一种实现是每个三秒回调被执行,大家可以根据自己的需求来做调整。
管理服务文件SerialMiscServiceManager.java实现
// File: SerialMiscServiceManager.java
package android.app;
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ISerialMiscService;
import android.os.ISerialMiscServiceCallback;
import android.util.Log;
public class SerialMiscServiceManager {
private static final String TAG = "SerialMiscServiceManager";
private ISerialMiscService mService;
public SerialMiscServiceManager(Context context, ISerialMiscService service){
mService = service;
}
public void setVal(String key,String value){
try {
mService.setVal(key,value);
} catch(Exception e){
Log.e(TAG, e.toString());
e.printStackTrace();
}
}
public String getVal(String key){
try {
return mService.getVal(key);
} catch(Exception e){
Log.e(TAG, e.toString());
e.printStackTrace();
}
return null;
}
public void registerCallback(ISerialMiscServiceCallback cb) {
try {
mService.registerCallback(cb);
} catch(Exception e) {
Log.e(TAG, e.toString());
e.printStackTrace();
}
}
public void unregisterCallback(ISerialMiscServiceCallback cb) {
try {
mService.unregisterCallback(cb);
} catch (Exception e) {
Log.e(TAG, e.toString());
e.printStackTrace();
}
}
}
上面主要是实现一个manger方便client端bind service,client端拿到manger对象就可以直接调用里面的api函数。
二、client端
示例代码
// test.java
import android.app.SerialMiscServiceManager;
import android.os.ISerialMiscServiceCallback;
private ISerialMiscServiceCallback mSerialMiscServiceCallback = new ISerialMiscServiceCallback.Stub() {
public void serverReport(String key, int value) {
Log.d(TAG, "---------KEY=" + key);
Log.d(TAG, "---------VAL=" + value);
}
};
SerialMiscServiceManager mSerialMiscServiceManager = (SerialMiscServiceManager) mContext.getSystemService(Context.SERIALMISC_SERVICE);
mSerialMiscServiceManager.setVal("hello", "world");
Log.d(TAG, "GET " + mSerialMiscServiceManager.getVal("hello"));
mSerialMiscServiceManager.registerCallback(mSerialMiscServiceCallback);
Log.d(TAG, "END register callback");
client端拿到mSerialMiscServiceManager之后,通过mSerialMiscServiceManager.setVal以sync方式设定key,也可以通过mSerialMiscServiceManager.getVal以sync方式获取key。或者通过mSerialMiscServiceManager.registerCallback方式注册一个mSerialMiscServiceCallback回调函数,等底层server端执行startCallback里面后serverReport,client端的mSerialMiscServiceCallback对应serverReport就可以拿到key和value