Android:传递没有序列化的对象

Android: pass object without serialization

我正在使用其他人编写的USB通信库。我正在使用一个活动来找到正确的USB设备并生成适当的驱动程序对象,我想在另一个活动中使用该驱动程序(这其中的原因有点复杂)。

不幸的是,驱动程序对象没有实现parcelable或serializable,所以我不确定如何实现。所以我有两个问题

1)在活动之间传递驱动程序对象有哪些选项?

2)即使我在问题1中成功了,我是否会因为接收活动没有得到使用USB对象的明确许可而遇到问题?


我想我参加聚会有点晚了,但没人提到服务的使用,这让我很苦恼。

活动可以绑定到服务并给出指示,服务将启动连接/通信作业。


除了以下选项(以及其他选项,如此处讨论的Web存储或JSON选项),没有办法将数据从一个Activity发送到另一个。你应该重新考虑你在做你想做的事情,或者考虑使用不同的Driver

如果代码是开放源代码或开放许可的,您可以考虑通过提取源代码并根据您的需要对其进行修改来黑客攻击SerializableParcelable。有关解压缩Android源的更多信息,请访问此处。

您可以使用多种方法在不同项目中的两个活动之间共享内容:

1。SharedPreferencesSQLiteSerializationContent Providers。这些都要求您将驱动程序对象分解为简单的类型。更多关于存储的信息可以在文档中找到。

2。Parcelables可通过Intent在活动之间共享。

在同一项目中的两个活动之间共享内容可以使用以下几种方法:

1。您可以使用SharedPreferencesSQLiteSerialization。更多关于存储的信息可以在文档中找到。

2。您可以将其设置为静态变量。例如,有一个Store类,在该类中保存静态变量:

1
2
3
4
public class Store {
    /** provides static reference to the driver */
    public static Object driver;
}

然后从任何地方设置,只需执行以下操作:

1
Store.driver = myDriver;

从任何地方出发,只要做到:

1
Object driver = Store.driver;

三.创建一个自定义的Application类,并在Android清单中设置它。这个应用程序可以存储驱动程序,不必是静态的。有关这方面的更多信息,可以在扩展应用程序以全局共享变量时找到。

4。第三个选项是为您的Activity创建一个singleton访问器。因此,在引用驱动程序的活动中,添加以下类变量:

1
private static MyActivity self;//replace MyActivity with the name of your class.

然后,添加getter:

1
2
3
public static MyActivity sharedMyActivity() {
    return self;
}

最后,在onCreate中添加该行(在调用super.onCreate(...)后):

1
self = this;

现在要访问您的驱动程序(我们会说它有一个getter),只需从任意位置调用:

1
Object driver = MyActivity.sharedMyActivity().getDriver();

至于问题的第二部分——如果您试图读取和写入不提供USB权限的Activity中的硬件设备,那么这将不起作用。


您可以将对象转换为JSON格式并作为字符串传递,在接收端,您可以再次将这个JSON字符串转换为对象。为此,您可以使用GSON库。网址:https://code.google.com/p/google-gson/downloads/list


可以使用fastjson轻松地将数据序列化为json字符串,然后恢复到对象。您需要做的只是为驱动程序对象创建setter和getter。

对于权限部分,您必须在用户安装包含活动的应用程序时向其询问。没办法跳过它。


1)您可以创建一个singleton对象来保存所有跨活动数据并将对象存储在那里。实现起来很简单。

2)权限授予整个应用程序,而不是单个活动。

就您的活动属于不同的应用程序而言,它们无法通过使用共享内存进行通信。