aidl的使用!

本文介绍了一个基于AIDL的Android服务端与客户端交互案例,包括服务端提供摄像头数据分享的功能实现,以及客户端如何注册监听器接收服务端的数据更新通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端

  1. 创建.aidl文件
  2. 添加mk文件
LOCAL_SRC_FILES += \
              src/com/android/zf/sharedata/aidl/ICameraShareData.aidl \
              src/com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \

LOCAL_AIDL_INCLUDES += \
              com/android/zf/sharedata/aidl/ICameraShareData.aidl \
              com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \

ISharedataArrivedListener.aidl

package com.android.zf.sharedata.aidl;
 interface ISharedataArrivedListener {
	/**
	 * AIDL客户端回调,返回服务端相应状态
	 * @param data
	 */
 void onNewFrameDataArrived(inout byte[] data,int start, int end,boolean theEndPart);
}
ICameraShareData.aidl
package com.android.zf.sharedata.aidl;
import com.android.zf.sharedata.aidl.ISharedataArrivedListener;

interface ICameraShareData{

 /**
 *初始化framedatabuffer
 */
 int initDataBuffer(int w, int h);
 /**
 *初始化framedatabuffer
 */
 void releaseDataBuffer();

 /**
 *输入帧数据
 */
 void inputFrameData(out byte[] data);

 /**
 *输入帧数据
 */
 void inputFrameDataByJoin(out byte[] data,int start, int end, boolean theEndPart);

 /**
 *输出帧数据
 */
 byte[] outFrameData();

 void inputFrameDataLock();

 void inputFrameDataUnLock();

 void registerListener(ISharedataArrivedListener listener);

 void unregisterListener(ISharedataArrivedListener listener);


 }

CameraShareDataService.java文件, 
package com.android.zf.sharedata.services;


import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.android.zf.sharedata.aidl.*;

import java.util.ArrayList;

public class CameraShareDataService extends Service{
    private final static String TAG = "CameraShareDataService";
    private int width = 0;
    private int height = 0;
    private byte[] framebuffer = null;
    private boolean lock = false;
    //private ICameraShareData.Stub mCameraShareData = null;
    private ArrayList<ISharedataArrivedListener> mArrayListListener = new ArrayList<ISharedataArrivedListener>();
    private IBinder mCameraShareData = new ICameraShareData.Stub(){
        @Override
        public int initDataBuffer(int w, int h){
            Log.d(TAG,"inputFrameData ");
            lock = false;
            width = w;
            height = h;

            framebuffer = new byte[(width*height*3)>>1];
            if(framebuffer == null){
                return -1;
            }else {
                return 0;
            }
        }

        @Override
        public void releaseDataBuffer(){
            Log.d(TAG,"inputFrameData ");
            lock = false;
            framebuffer = null;
        }

        @Override
        public void inputFrameDataLock(){
            //Log.d(TAG,"inputFrameDataLock ");
            lock = true;
            return;
        }

        @Override
        public void inputFrameDataUnLock(){
            Log.d(TAG,"inputFrameDataUnLock ");
            lock = false;
            return;
        }

        @Override
        public void inputFrameData(byte[] data){
            String strRead = new String(data);
            strRead = String.copyValueOf(strRead.toCharArray(), 0, data.length);
            Log.d(TAG,"inputFrameData data=="+strRead);
            if(framebuffer != null){

                //System.arraycopy(data,0,framebuffer,0,data.length);
                //onNewFrameDataArrived(framebuffer);
            }
            return ;
        }

        @Override
        public void inputFrameDataByJoin(byte[] data, int start, int end,boolean theEndPart){
            //Log.d(TAG,"inputFrameDataByJoin ");
            //if(lock){
                //if(framebuffer != null){//Arrays.copyOfRange
                    //System.arraycopy(data,start,framebuffer,start,end-start);
                    onNewFrameDataArrived(data,start,end,theEndPart);
                //}
            //}
        }

        @Override
        public byte[] outFrameData(){
            return framebuffer;
        }

        @Override
        public void registerListener(ISharedataArrivedListener listener){
            if(!mArrayListListener.contains((ISharedataArrivedListener)listener)){
                Log.d(TAG,"registerListener success");
                mArrayListListener.add(listener);
            }else{
                Log.d(TAG,"registerListener fail");
            }

        }
        @Override
        public void unregisterListener(ISharedataArrivedListener listener){
            if(mArrayListListener.contains((ISharedataArrivedListener)listener)){
                Log.d(TAG,"unregisterListener success");
                mArrayListListener.remove((ISharedataArrivedListener)listener);
            }else{
                Log.d(TAG,"unregisterListener fail");
            }
        }

    };

    @Override
    public void onCreate() {
        super.onCreate();
        //new Thread(new ServiceNotify()).start();


    }

    @Override
    public IBinder onBind(Intent intent) {
        return mCameraShareData;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    private void onNewFrameDataArrived(byte[] data, int start, int end,boolean theEndPart){
        for(int i=0;i<mArrayListListener.size();i++){
            ISharedataArrivedListener listener  = mArrayListListener.get(i);
            try{
                if(listener != null) {
                    listener.onNewFrameDataArrived(data,start,end,theEndPart);
                }
            }catch (RemoteException exception){
                exception.toString();
            }
        }
    }
}



客户端

  1. 创建.aidl文件(从服务端,拷贝而来,完全一样)
  2. 添加mk文件
LOCAL_SRC_FILES += \
              src/com/android/zf/sharedata/aidl/ICameraShareData.aidl \
              src/com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \

LOCAL_AIDL_INCLUDES += \
              com/android/zf/sharedata/aidl/ICameraShareData.aidl \
              com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \

调用的代码:

    public void onStart() {
        Intent mIntent = new Intent();
        mIntent.setAction("com.android.zf.sharedata.aidl.CAMERA_SHARE_DATA_SERVICE");//你定义的service的action
        mIntent.setClassName("com.android.zf.sharedata","com.android.zf.sharedata.services.CameraShareDataService");
        mCameraActivity.getApplicationContext().bindService(mIntent,mServiceConnection, Context.BIND_AUTO_CREATE);
    }

    public void onStop() {
        mCameraActivity.getApplicationContext().unbindService(mServiceConnection);
    }
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            android.util.Log.d("CameraShareDataService", "onServiceConnected ");
            mCameraShareData = ICameraShareData.Stub.asInterface(iBinder);
            try {
                mCameraShareData.registerListener(mSharedataArrivedListener);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            android.util.Log.d("onServiceDisconnected","onServiceConnected ");
            try {
                mCameraShareData.unregisterListener(mSharedataArrivedListener);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
            mCameraShareData = null;
        }
    };


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gnimey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值