AIDL示例

前面的文章,介绍了aidl的几个必要组成部分,以及其关系。这里由一个例子来更好的说明,并且,可以引向更深的问题。
aidl在android应用层里面常用于单独进程的service与activity通讯。如果在同一个进程中的service与activity,当然没必要这样做。这两种使用service的方式,在形式上当然也是有区别的。
现在我们要在一个单独的进程中,实现add方法,并且把结果返回给client。我们知道Binder机制可以实现进程之间通讯,所以Client肯定要能获取到Binder,但是如何获取呢?

public class MainActivity extends AppCompatActivity {
    private ITest mITest;
    ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //在这里拿到ITest
            try {
                mITest = ITest.Stub.asInterface(service);
                //调用ITest中的方法,实际上是调用了Proxy的方法
                int sum = mITest.add(1, 2);
                Log.d("test", "sum = " + sum);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this, RemoteService.class);
        bindService(intent, mConnection, BIND_AUTO_CREATE);
    }
}

Proxy是代理的意思,当然是给client用的,但是,Proxy是Stub的私有类,不能直接在client中获取并调用其方法,所以只能通过Stub提供的asInterface方法暴露出来。我们再来看看这个方法

public static com.example.aidl.ITest asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.example.aidl.ITest))) {
return ((com.example.aidl.ITest)iin);
}
//这里很明显了
return new com.example.aidl.ITest.Stub.Proxy(obj);
}

前几篇文章分析可知,Stub是用在service中的,所以这段代码是好理解的。

public class RemoteService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return new TestBinder();
    }
	//service要实现ITest.aidl中定义的函数,它是真正干活的
    class TestBinder extends ITest.Stub{
        @Override
        public int add(int a, int b) throws RemoteException {
            return a+b;
        }
    }
}

mainifest中的配置 ,让service真正运行在独立的进程当中

<service android:name=".RemoteService"
   android:process="com.chopin.test"></service>
更多的思考

这个例子,client是在java层定义,service也是在java层定义,似乎与底层无关。进程之间的通讯,不可能离开系统层的,因为无论是何种机制,都是基于系统层的调用。只不过android的封装,让这些变得简单,隐藏了底层细节。

AIDL和HIDL是安卓中用于进程间通信的两种重要技术。 AIDL是Android Interface Definition Language的缩写,是一种用于定义客户端和服务端之间通信接口的语言。在安卓系统中,应用程序运行在各自的进程中,为了实现不同进程之间的数据交互和方法调用,AIDL提供了一种方便的方式。通过AIDL,我们可以定义一个接口,并让服务端实现这个接口,客户端通过这个接口与服务端进行通信。AIDL支持基本数据类型、自定义数据类型以及文件传输等功能,可以方便地进行对象的序列化和反序列化。开发者只需要定义接口和数据类型,系统会自动生成具体的通信类。 HIDL是Android Hardware Interface Definition Language的缩写,是一种用于定义硬件模块和驱动程序之间通信接口的语言。在安卓系统中,硬件驱动程序需要提供给应用程序使用的接口,以便应用程序通过接口与硬件模块进行交互。HIDL提供了一种标准化的接口定义语言,可以让硬件模块的供应商和应用程序开发者进行无缝沟通。HIDL支持包括基本数据类型、自定义数据类型、共享内存、进程间通信等功能,可以方便地使用不同类型的硬件模块。 在实际使用中,我们可以利用AIDL和HIDL来实现不同进程之间的通信。比如,一个应用程序需要与后台服务进行通信,可以通过AIDL定义接口,在客户端和服务端分别实现该接口,并在应用程序中调用服务端的方法。另外,如果应用程序需要使用特定硬件模块(如摄像头、传感器等),可以通过HIDL定义硬件接口,并在应用程序中调用这些接口来与硬件模块进行交互。 综上所述,AIDL和HIDL是两种在安卓系统中实现进程间通信的重要技术,分别用于应用程序之间和应用程序与硬件模块之间的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值