AIDL文件中使用实现接口Parcelable的类

在官方文档中说明了,在AIDL文件中可以使用:

AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。
    其中对于Java编程语言的基本数据类型 (int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。
    而如果需要在AIDL中使用其他AIDL接口类型,需要import,即使是在相同包结构下。AIDL允许传递实现Parcelable接口的类,需要import.
    需要特别注意的是, 对于非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括in、out和inout,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。
    AIDL只支持接口方法,不能公开static变量。
其中就说明了可以使用: Parcelable接口的类

比如:IMyService.aidl

package com.demo; 

import com.demo.Person; 

interface IMyService { 
        void savePersonInfo(in Person person); 
        List<Person> getAllPerson(); 
}

在这里使用了Person类,如果Person没有使用什么神奇的功效是不可使用在这里的。

看下:Person类的神奇之地:

public class Person implements Parcelable { 

        private String name; 
        private String telNumber; 
        private int age; 

        public Person() {} 

        public Person(Parcel pl){ 
                name = pl.readString(); 
                telNumber = pl.readString(); 
                age = pl.readInt(); 
        } 

        public String getName() { 
                return name; 
        } 

        public void setName(String name) { 
                this.name = name; 
        } 

        public String getTelNumber() { 
                return telNumber; 
        } 

        public void setTelNumber(String telNumber) { 
                this.telNumber = telNumber; 
        } 

        public int getAge() { 
                return age; 
        } 

        public void setAge(int age) { 
                this.age = age; 
        } 

        @Override 
        public int describeContents() { 
                return 0; 
        } 

        @Override 
        public void writeToParcel(Parcel dest, int flags) { 
                dest.writeString(name); 
                dest.writeString(telNumber); 
                dest.writeInt(age); 
        } 

        public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() 

                @Override 
                public Person createFromParcel(Parcel source) { 
                        return new Person(source); 
                } 

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

        }; 
}

对于Parcelable的使用在这里简单的描述下:

是一个序列化的类,这里使用Parcelable 接口来序列化,是Android提供的一个比Serializable 效率更高的序列化类。
    Parcelable需要实现三个函数:
    1)  void writeToParcel(Parcel dest, int flags) 将需要序列化存储的数据写入外部提供的Parcel对象dest。而看了网上的代码例子,个人猜测,读取Parcel数据的次序要和这里的write次序一致,否则可能会读错数据。具体情况我没试验过!
    2)  describeContents() 没搞懂有什么用,反正直接返回0也可以
    3)  static final Parcelable.Creator对象CREATOR  这个CREATOR命名是固定的,而它对应的接口有两个方法:
    createFromParcel(Parcel source) 实现从source创建出JavaBean实例的功能。
最后,别忘了创建文件
Person.aidl
内容如下:
package  com.demo; 

parcelable Person;

注意这里的parcelable和原来实现的Parcelable 接口,开头的字母p一个小写一个大写。
对于实现AIDL接口,官方还提醒我们:
    1. 调用者是不能保证在主线程执行的,所以从一调用的开始就需要考虑多线程处理,以及确保线程安全;
    2. IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。也就是IPC调用会挂起应用程序导致界面失去响应,这种情况应该考虑单独开启一个线程来处理。
    3. 抛出的异常是不能返回给调用者(跨进程抛异常处理是不可取的)。
对于,其他的部分见前面的一文: Android 服务Service
<service android:name=".YourService" android:process=":remote"> 
        <intent-filter> 
                <action android:name="com.demo.IMyService" /> 
        </intent-filter> 
</service>
android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。不加,可能会提示空指针异常。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIDL(Android Interface Definition Language)是一种Android特有的IPC(Inter-Process Communication,进程间通信)机制,可以实现跨进程通信。以下是使用AIDL实现跨进程通信的步骤: 1. 定义AIDL接口:在AIDL文件定义接口和方法,这些接口和方法将在不同进程之间进行调用。例如,定义一个接口IStudentManager和一个方法addStudent()。 2. 实现AIDL接口:在Service实现AIDL接口,可以在Service创建一个Binder对象,然后将该对象返回给客户端,客户端可以使用这个Binder对象调用Service的方法。 3. 绑定Service:在客户端绑定Service,通过这种方式,客户端可以获取到Service的Binder对象,然后调用Service的方法。 4. 调用方法:在客户端通过Binder对象调用Service的方法,实现跨进程通信。 注意事项: 1. 在使用AIDL时,需要在AndroidManifest.xml文件注册Service。 2. AIDL接口只能使用基本数据类型和Parcelable类型,不支持其他类型。 3. AIDL接口定义的方法必须是线程安全的,因为它们可能在不同进程被调用。 4. AIDL接口定义的方法必须是只读的,不应该修改传入的参数。 5. AIDL接口的方法返回值必须是void或者基本数据类型、String、CharSequence、Parcelable类型。 6. AIDL接口的方法可以抛出RemoteException异常,因为AIDL接口是基于Binder实现的,所以需要处理Binder连接断的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值