Android aidl简单使用

Android  代码片段  2023年6月5日 pm6:56发布1年前 (2023)更新 城堡大人
122 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

[摘]Typora破解和下载(仅供学习)

前言本文摘抄,方便自己查阅。正文隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参考文章《Typora(morkdown编辑器)的下载和破解》PS: 上面只是个人观点,也就偶尔使用此工具,如果是商用,请购买正版激活码吧,谢谢

Web网站置灰的几种方式代码

前言众所周知,一般有大事情,很多官方网站的首页就会置灰。对这个比较感兴趣,因此就查询了一下,发现设置全站置灰的方式很简单。记录一下,方便自己查阅。PS: 本文内容摘抄的,文末有原作者连接正文置灰涉及全屏置灰,另外一种是首屏置灰。下面记录一下置灰的代码。全屏置灰方式一亲测,有效。...

《MySQL基础教程》笔记6

前言主要是记录一下update和delete命令的使用。根据《MySQL基础教程-西泽梦路》学习,简单的做一下笔记。记录于此,方便自己回忆。正文我这以Window版的phpstudy软件验证。需要进入这个目录,才可以使用mysql命令D:\phpstudy_pro\Extensions...

Android中走马灯相关问题总结

前言Android开发中,应该都或多或少使用过TextView的走马灯(或跑马灯)。对于走马灯存在的问题,网上很多,我也在这里整(抄)理(袭)一下,方便自己查阅。跑马灯耗CPU可以BiuTextView替换,请访问------>《BiuTextView完美替代TextView进行跑马...

List排序简单记录

前言简单整理一下List的集合的排序,简单的记录一下,方便自己后续查阅。正文这里介绍一下使用Comparable和Comparator进行排序Comparable在实现的FileInfo实现Comparable,然后实现排序compareTo()即可。具体如下public class ...

白寅:致中文系

你必须是静悄悄地在全校最古旧的一幢楼里在别人发飞信的时候用笔一个字一个字地写明信片你必须是揣着馒头夹榨菜在别人逛步行街的时候坐在阴凉的山北看整整一天的红杜鹃你一定要在草坪上开班会却在教室里化装跳舞你一定要在咖啡馆里争论乾坤阴阳却在中央广场上伫立走神你肯定在走进大学校门...