AIDL使用异常记录

Android  2023年8月16日 am8:08发布1年前 (2023)更新 城堡大人
71 0 0

前言

记录一下AIDL中常见的问题,方便自己回忆和学习。

正文

这里以BookBean为例

package com.biumall.binderlibmedia.bean;
import android.os.Parcel;
import android.os.Parcelable;
public class BookBean implements Parcelable{
    private String name;
    private String author;
    private double price;
    private int page;
    //略
    protected BookBean(Parcel in) {
        //PS: 读值顺序和writeToParcel()方法中一致的
        name = in.readString();
        author = in.readString();
        price = in.readDouble();
        page = in.readInt();
    }
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(author);
        dest.writeDouble(price);
        dest.writeInt(page);
    }
    public static final Creator<BookBean> CREATOR = new Creator<BookBean>() {
        @Override
        public BookBean createFromParcel(Parcel in) {
            return new BookBean(in);
        }

        @Override
        public BookBean[] newArray(int size) {
            return new BookBean[size];
        }
    };
}

无法解析BookBean

Failed to resolve 'BookBean'
原因

BookBean不是AIDL支持豁免的类型,这个是我们定义的封装类,需要手动导入对应的包名。

AIDL支持int,short,boolean等基本类型,以及String,CharSequence和List自动导入包名,但其他的都需要手动导入。

比如上面的BookBean活ArrayList等需要手动导入。

解决方法

导入BookBean的包名

import com.biumall.binderlibmedia.bean.BookBean;

无法找到BookBean类

couldn't find import for class com.biumall.binderlibmedia.bean
原因

aidl这个语言的规范就是aidl文件,需要把BookBean转为aidl文件给其他aidl调用。

解决方法

在aidl目录下,创建BookBean一样的包名目录

com.biumall.binderlibmedia.bean

在创建的目录下,创建aidl文件,改名字为BookBean.aidl,写入如下内容

package com.biumall.binderlibmedia.bean;
parcelable BookBean;

PS : parcelable是小写

can be an out type

parameter bean (argument 1): 'com.biumall.binderlibmedia.bean.BookBean' can be an out type, so you must declare it as in, out, or inout.
原因

有些类型缺少in\out\inout标签就会报错。

in 表示数据只能由客户端流向服务端; out 表示数据只能由服务端流向客户端;inout 表示数据可在服务端和客户端双向流通。

解决方法

我这异常提示是如下两个方法

void addBook(BookBean bean);
boolean removeBook(BookBean bean);

添加一个in标签,如下

void addBook(in BookBean bean);
boolean removeBook(in BookBean bean);

参考文章

  1. 创建AIDL的常见问题 can be an out type, so you must declare it as in, out, or inout.

  2. Android 深入浅出AIDL(一)

  3. AIDL之注册和解注册监听器

 历史上的今天

  1. 2020: 周国平:时光村落里的往事(0条评论)
  2. 2019: 鲁迅:两地书(节选)(0条评论)
  3. 2017: adb启动service等(0条评论)
  4. 2017: adb shell dumpsys的使用(0条评论)
  5. 2017: WordPress博客搬家教程(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Android 6.0 Settings源码简单分析之蓝牙(2)

上一篇《Android 6.0 Settings源码简单分析之蓝牙(1)》我们只是简单的介绍了蓝牙的界面和流程的启动,讲得比较粗糙,这次我们继续深入讨论蓝牙,设计Framework的代码源码:Android 6.0应用:Settings 和 Framework(权且看做一个应用吧^_^...

jaudiotagger解析ID3第三版

前言之前介绍过jaudiotagger的第二版《jaudiotagger解析ID3第二版》,虽然代码上有优化,但还是效果不是不太理想,当然比第一版好多了哈。因此阅读jaudiotagger源码进行对之前的代码优化。正文导入jaudiotagger.jar导入lib库/libs/jaud...

Android消息机制之二简介(2)

我们通过上一篇《Android消息机制Handler,Looper,Message,MessageQueue关系之一》知道,Android的消息机制必须将Handler,Looper,Message,MessageQueue一起“组织”起来,而且是缺一不可。比如在子线程中使用Handler必须先L...

Linux一键安装web环境使用

看本教程需要需要在阿里云的云市场中购买阿里云linux一键安装web环境(含视频教程)安装包,这个我很早就在使用。偶然发现这教程还是可以的额,因此在这摘抄一下自己平常使用的,算是总结吧。目前使用apache比较多,因此以这个为准。0、一键安装后的路径网站目录:/alidata/ww...

Zygote的启动之二ZygoteInit

前言Android系统中,所有的应用程序以及SystemServer都是由Zygote进程孕育(fork)出来的。接上文,上文介绍从Native世界进入了Java世界。而且java世界的大门就是ZygtoeInit.java。这次我们看ZygtoeInit中处理了哪些功能。Android P...

李娟:通往滴水泉的路

最早的时候,通往滴水泉的路只有“乌斯曼小道”。乌斯曼是一百年前那个鼎鼎有名的阿尔泰土匪头子,被称为“哈萨克王”。而更早的一些时候,在这茫茫戈壁,所有的路都只沿着其边缘远远绕过。那些路断断续续地,虚弱地进行在群山褶皱之中,遥遥连接着阿尔泰的绿洲和南方的草原雪山。没有人能从这片荒原的腹心通过。没有水,...