在现有的java类

时间:2018-05-13 19:12:42

标签: java android kotlin

我正在使用UsbSerialForAndroid库来实现与设备的串行端口连接。

我需要跨活动发送serial port个对象。 UsbSerialPort的定义是here

目前,我的代码能够借助putExtra Intent方法返回指定端口地址的字符串。我希望将serial port发送到另一个活动(这是因为我无法从地址重新创建串行端口对象)。

为了发送一个对象和Intent,该对象应该是可以分配的。但原始的类文件在java中。

如何在这样一个预先存在的java类上实现parcelable?我更喜欢使用kotlin语言来实现这一目标。

修改

一个似乎合乎逻辑的选项是使用原始 SerialUsbPort类作为基类,并将新类扩展为parcelable(使用@Parselize注释)然后强制转换为旧对象变成新的(是不是就是这样?)。

2 个答案:

答案 0 :(得分:2)

因此,总的来说,你的问题是你需要发送一个库对象的实例;但要发送它,它需要实现一个接口。正确的吗?

使用Java / Kotlin互操作有几种方法可以做到这一点,但它们都不是特别原创的。实际上,你很幸运,你正在使用的库也不是用Kotlin编写的,因为Kotlin类默认是final。另一方面,Java类不是;这就是为什么你能做这样的事情:

MySerialPort.kt

class MySerialPort : UsbSerialPortImpl(), Parcelable {
  ...
}

当然,这是假设一些事情:

  1. 您正在使用库中的UsbSerialPort实现。毕竟,你链接的类是一个接口,而不是一个具体的类。你必须从某处获得一个具体的类才能初始化它,所以我假设它是一个库类。

  2. UsbSerialPortImpl课程不是final。如上所述,这(幸运的是)不是Java中的默认值,所以你可能很好。

答案 1 :(得分:2)

  

我希望将串口发送到另一个活动(这是因为我无法从地址重新创建串口对象)。

不幸的是,要实现Parcelable,您需要做到这一点:告诉Android如何将一些数据写入Parcel以及如何从数据中重新创建此对象。

@Parcelize不会改变这个要求,它只是告诉编译器以标准方式生成这些方法。

要访问无法重新创建的“实时”对象,请扩展Binder(请参阅https://developer.android.com/guide/components/bound-services#Binder以获取Java中的示例)。现在,您可以在实施Binder时在Parcel中存储Parcelable