Android aidl简单使用

Android  代码片段  2023年6月5日 pm6:56发布1年前 (2023)更新 91es.com站长
85 0 0

前言

简单记录一下aidl的使用,方便自己查阅和复习。

正文

因为客户端和服务端都需要引入相同的aidl的定义,因此这里单独吧aidl文件作为一个lib库。

Biu2Aidl库

Biu2Aidl是lib库,存放客户端和服务端共同的aidl定义和Constant类。

IBook.aidl

/Biu2Aidl/src/main/aidl

// IBook.aidl
package com.biumall.biu2aidl;

interface IBook {
    //发送Book信息
    void sendBookInfo(String bookName);
}

这个只是开始,所以定义一个简单点的。

AidlConstant.java

定义一些常量,方便统一修改。

public class AidlConstant {

    public final static String TAG= "Aidl_";

    public static final String SERVER_SERVICE_PACKAGE = "com.biumall.biu2server";
    public static final String SERVER_SERVICE_NAME = "com.biumall.biu2server.service.AidlServerService";
    public static final String SERVER_SERVICE_AIDL_ACTION = "com.biumall.action.START_SERVER_SERVICE";
}

build.gradle中添加
buildFeatures{aidl true}

Biu2Server服务端

AndroidManifest.xml
<service
    android:name=".service.AidlServerService"
    android:exported="true">
    <intent-filter>
        <action android:name="com.biumall.action.START_SERVER_SERVICE" />
    </intent-filter>
</service>
AidlServerService.java

这个就是返回BookIBinder,并实现aidl中的接口,这样就客户端就可以跟服务端通信了。

public class AidlServerService extends Service {
    private static final String TAG = "AidlServerService_";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //返回IBinder
        return new BookIBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    //
    private static class BookIBinder extends IBook.Stub {
        @Override
        public void sendBookInfo(String bookName) throws RemoteException {
            Log.d(TAG, "sendBookInfo bookName : " + bookName);
        }
    }
}

Biu2Client客户端

ClientApp.getContext()是实现Application类中返回的Context,这里懒得附上。

下面是在定义绑定和解除绑定的。

//获取到mIBook后就可以跟服务端进行通信
private IBook mIBook;

//绑定
private void bindService() {
    Log.d(TAG, "bindService: ");
    if (null == mIBook) {
        Intent intent = new Intent();
        intent.setPackage(AidlConstant.SERVER_SERVICE_PACKAGE);
        intent.setAction(AidlConstant.SERVER_SERVICE_AIDL_ACTION);
        boolean bind = ClientApp.getContext().bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
        Log.d(TAG, "bindService MediaService.class " + (bind ? "success ^_^" : "fail ~_~"));
    }
}

//解除绑定
private void unbindService() {
    Log.d(TAG, "unbindService: ");
    if (null != mIBook) {
        ClientApp.getContext().unbindService(mServiceConnection);
        mIBook = null;
    }
}

private final ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG, "onServiceConnected name : " + name + " , service :" + service);
        mIBook = IBook.Stub.asInterface(service);
        try {
            //向服务端发送消息
            mIBook.sendBookInfo("Hello word!");
            //linkToDeath监听
            mIBook.asBinder().linkToDeath(new IBinder.DeathRecipient() {
                @Override
                public void binderDied() {
                    Log.d(TAG, "binderDied : ");
                }
            }, 0);
        } catch (RemoteException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG, "onServiceDisconnected name : " + name);
    }
};

参考文章

 历史上的今天

  1. 2021: adb push有中文名的apk或者路径会出现名字不全(0条评论)
  2. 2018: TextView设置倾斜右边显示不全(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Launcher根据包名启动应用

前言很多项目中Launcher是有可能自定义的,毕竟Android原生的Launcher比较庞大,有时候需要的需求很简单,自己重新写Launcher也比较容易维护。为啥要根据包名启动,因为一个应用可能存在多个Activity,当按Home键退出后,再次从Launcher界面点击需要回到之前展示...

Android中onConfigurationChanged的总结

前言记录一下Android设备横屏、竖屏和分屏的适配说明。正文Android应用中不在AndroidManifest.xml做配置时,我的如下(这里配置很多,看你自己需求删减,这里也不一一介绍):<activity   android:name=".MainActivity" ...

AndroidManifest.xml的configChanges配置简介

Android文档介绍configurationAndroid中的组件Activity在AndroidManifest.xml文件中可以指定参数android:configChanges,用于捕获手机状态的改变。如果Activity添加了android:configChanges属性,在当所指...

许钦文:花园的一角

荷花池和草地之间有着一株水杨,这树并不很高,也不很大,可是很清秀,一条条的枝叶,有的仰向天空,随风摆宕,笑嘻嘻的似乎很是喜欢阳光的照临;有的俯向水面,随风飘拂,和蔼可亲的似乎时刻想和池水亲吻;横在空中的也很温柔可爱,顺着风势摇动,好像是在招呼人去鉴赏,也像是在招呼一切可爱的生物。在同一池沿,距离这...

Can't determine type for tag

前言引入公共库库(commonLib)时,出现如下异常,说实话,看不懂哈,就问谷歌了。Can't determine type for tag '<macro name="m3_comp_assist_chip_container_shape">?attr/shapeAppeara...

TextView.setWidth()竟然失效了

前言TextView.setWidth()失效(无作用),其实好奇,既然没作用,为啥要预留这个方法呢?记录一下,方便自己查阅。正文既然要刨根问底,就需要看源码TextView。看了一下源码TextView.setWidth()//[来自谷歌翻译]//将 TextView 的宽度设置为...