Android10 自建System API AIDL跨进程回调

以一个串口混杂类型为例,需要完成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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值