Android跨进程通信之《AIDL》

发布时间:2023-04-27 15:00

Step1:创建AIDL 文件
Android跨进程通信之《AIDL》_第1张图片
会在 main 包里生成 一个接口文件:

    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

这里的方法可以去掉,写成自己的回调方法。注意,AIDL 只支持以下数据类型:

(1)、八种基本数据类型:byte,char,short、int、long、float、double、boolean、String,CharSequence。
(2)、实现了Parcelable接口的数据类型。
(3)、List 类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象。
(4)、Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象。

当我们写好自己回调方法后,Rebuild以下工程,就会生成对应的Stub 。

interface IConnectStatusAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */

      void sendConnectInfo(double fps,double bitrate,double packetLossRate,double rtt,double frames,double height,double width,long durationTime);
}

以上是我自己的接口回调。

Step2:创建Service

public class ConnectInfoService extends Service {
    private static final String TAG = ConnectInfoService.class.getSimpleName();


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


    IConnectStatusAidlInterface.Stub stub = new IConnectStatusAidlInterface.Stub() {

        @Override
        public void sendConnectInfo(double fps,
                                    double bitrate,
                                    double packetLossRate,
                                    double rtt,
                                    double frames,
                                    double height,
                                    double width,
                                    long durationTime) throws RemoteException {
            Log.e(TAG, "stub fps=" + fps+",bitrate="+bitrate+",packetLossRate="+packetLossRate+",rtt="+rtt);
            Log.e(TAG, "stub frames=" + frames+",height="+height+",width="+width+",durationTime="+durationTime);
        }
    };

}


在Manifest 文件中配置

        

Step3:绑定Service 传输数据

  • 1.创建ServiceConnection
    private final ServiceConnection serviceConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            statusAidlInterface = IConnectStatusAidlInterface.Stub.asInterface(service);

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
  • 2.绑定服务
 Intent intent = new Intent(this, ConnectInfoService.class);
 bindService(intent, serviceConnection, BIND_AUTO_CREATE);
  • 3.数据通信传输
          if (statusAidlInterface != null) {
                            try {
                                statusAidlInterface.sendConnectInfo(stat.clientFps, maxbitrate, stat.packetLostRate, stat.roundTripTime, 0, 0, 0, currentTimeMillis);
                            } catch (RemoteException e) {
                                e.printStackTrace();
                            }
        }

以上就是整个AIDL 的创建和使用过程。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号