【问题标题】:Why are bundles used as opposed to standard Objects?为什么使用捆绑包而不是标准对象?
【发布时间】:2019-03-10 22:29:57
【问题描述】:

在 android 中,为什么使用包而不是类?这肯定不是很有效。我发现它也使事情变得非常混乱,因为您必须使用类中的大量静态键,而这些键的范围通常不是很好。也不是很直观。

我确信可以使用泛型,因此您不必盲目地转换返回的对象。

【问题讨论】:

    标签: android performance android-intent bundle android-lifecycle


    【解决方案1】:

    BundleParcelableParcelable 对象旨在跨进程边界传递。因此,您会看到 Bundle 和其他 Parcelable 对象在涉及进程间通信 (IPC) 的情况下被大量使用,包括:

    • Intent extras,因为我们每次启动活动、启动服务等时都使用 IPC。

    • 保存的实例状态,因为该状态保存在核心操作系统进程中,以防我们自己的进程被终止

    任意对象不能跨越进程边界。


    另外,Bundle 是一个框架类。所有应用程序,加上核心操作系统,都使用相同的定义。因此,Bundle 可以从一个应用程序传递到另一个应用程序,并且两个应用程序都可以使用 Bundle 的内容(假设其内容本身是简单的原语或基于其他共享类定义)。

    即使您创建自己的类 Parcelable,当其他应用尝试访问该对象时,您也可能会遇到问题,因为它们不会有您的类定义。


    对于您自己的应用程序(尤其是如果您使用单活动 UI 方法),您需要使用 Bundle 的唯一时间是保存的实例状态。如果您正在使用ViewModel 或类似的方式处理配置更改,则不需要在保存的实例状态Bundle 中存储太多。

    【讨论】:

    • 关于使用您的 Bundle 的其他应用程序的观点,他们仍然必须访问您的类以找到该包的适当密钥。这就像从另一个应用程序获取数据作为缓冲区一样,您仍然需要某种形式的协议来实际读取它。
    • @Tobiq:“他们仍然必须访问您的班级才能找到适合捆绑包的密钥”——并非如此。键是字符串。它们可以由程序员输入。 “这就像从另一个应用程序获取数据作为缓冲区,你仍然需要某种形式的协议来实际读取它”——正确。但是,Bundle 就像 JSON,您不需要特定于协议的类来读取它。另一方面,自定义 Parcelable 不能在没有特定于协议的类的情况下使用。
    • "你仍然需要某种形式的协议才能真正[理解]它"
    • 您最终不得不查阅文档(如果您有幸提供了任何文档)以进行最简单的数据检索。
    • @Tobiq:如果这完全在一个项目中(例如,保存的实例状态),那么您同样需要使用自定义类方法的文档。如果这是跨应用程序,您不仅需要该文档,还需要实际的类,这往往是一个更大的问题。另请注意,如果您使用的是 Kotlin,则可以在 Bundle 上创建私有扩展函数,让您有自定义类的感觉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多