【问题标题】:AIDL interface can't find import for Parcelable classAIDL 接口找不到 Parcelable 类的导入
【发布时间】:2013-07-30 18:54:47
【问题描述】:

我的问题似乎与this questionthis one 相似,但有点不同。

我正在创建一个库项目中的 AIDL 服务,并在我的应用程序中使用它。我的应用程序中有一个 Vehicle 类,我已将其制成 parcelable 以便我可以在我的界面中使用它。 (我想从我的服务中获取我的应用程序库中的车辆列表)

应用程序和库中是否需要 Vehicle.java?

两者都需要 Vehicle.aidl 吗?

我在应用程序和库中都有 Vehicle.java 和 Vehicle.aidl,我开始在我的应用程序中遇到一个问题,当我从接口调用方法时,eclipse 希望我将其定义为库类的 Vehicle 和不是应用程序(尽管它们是相同的并且都是可打包的)。

public List<Vehicle> getVehicles(){...code... }

为了解决这个问题,我尝试在 IRemoteInterface.aidl 中将其设置为应用程序的车辆类而不是库的车辆类(在下面列出的变体中,我收到一个错误,它找不到导入。在其他变体中,比如让它成为 List 而没有导入,它表示未知的返回类型)。

  package LIBRARY;


import LIBRARY.RelPoint;
import LIBRARY.IRemoteServiceCallback;
import LIBRARY.FleetStatus;
import APPLICATION.Vehicle;


interface IRemoteInterface {

    int getPid();

    void registerCallback(IRemoteServiceCallback callback);
    void unregisterCallback(IRemoteServiceCallback callback);

    List<Vehicle> getVehicles();

}

这是我的应用程序中的 Parcelable Vehicle 类

package APPLICATION;

import java.util.Date;

import android.os.Parcel;
import android.os.Parcelable;


public class Vehicle implements Parcelable {
    public static final String TAG = "Vehicle";

    long vehicleID;
    long trackID;
    String vehicleName;



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

            public Vehicle createFromParcel(Parcel src) {
                return new Vehicle(src);
            }

            public Vehicle[] newArray(int size) {
                return new Vehicle[size];
            }

        };



        public Vehicle(Parcel src) {
            readFromParcel(src);
        }

        public void writeToParcel(Parcel dest, int flags) {
            dest.writeLong(vehicleID);
            dest.writeLong(trackID);
            dest.writeString(vehicleName);
        }

        public void readFromParcel(Parcel src) {
            vehicleID = src.readLong();
            trackID   = src.readLong();
            vehicleName = src.readString();

        }

        public int describeContents() {
            // nothing special
            return 0;
        }


    public Vehicle() {

    }

    //getter and setter methods below that I removed



}

【问题讨论】:

    标签: java import android-service aidl


    【解决方案1】:

    我有理由确定您需要在两端的同一包中拥有 Parcelable 类(这就是您在库端使用 APPLICATION 中的类最终得到的结果,我会这样做另一种方式)。这个包也必须是在相应的aidl 文件中声明的那个。

    我建议使用像com.example.interop 这样的子包来使这个更干净(即,将共享对象分离到它们自己的包中)。然后双方应该在该包中都有一个 Java 文件 + 一个声明它的 aidl 文件。

    【讨论】:

    • 感谢您来到这里!从应用程序中删除车辆类?我需要在那里使用 Vehicle 来做其他事情,这是否意味着我需要将 Vehicle 引用为 LIBRARY.Vehicle?库中的车辆是否无法使用应用程序中的车辆?(我从服务中获取车辆,我想将该车辆放入我设置的 SQLite 数据库中)
    • 当您说“库”时,您是指 Android 库还是已安装的库包?即,此设置会产生多少个 apk?
    • 已安装的库包。这是我老板的代码,我正在修改它以满足我的需要。我将其设置为依赖项或其他任何内容(我之前已成功将该库用于其他事情)
    • 所以理想情况下,LIBRARY 中对 Vehicle 的任何引用都是 APPLICATION 的 Vehicle
    • 你能多解释一下第二部分吗?创建一个包含 Vehicle.java 和 Vehicle.aidl 的包?这个包在哪里(在应用程序、库或新地方?)
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2018-08-18
    相关资源
    最近更新 更多