使用 Parcelable 是在应用程序之间发送数据的正确方法吗?

2024-01-15

我试图了解如何在 Android 中的应用程序之间进行通信 - 而不仅仅是在应用程序之间进行通信Activity实例。

我设置了一个“客户端”,将 Messenger 对象发送到服务(在Intent发送到服务);该服务创建了一个Messageobj 并将其发送回“客户端”使用messenger.send(message)。这工作正常,直到我尝试使用 Message.obj 来保存对象。

我创建了自己的Parcelable class MyParcelable在服务中并将其放入消息中。一切正常,直到消息在“客户端”中被解组为止。解组失败,因为“客户端”无权访问MyParcelable班级。这是显而易见的 - 它们位于不同的包中(例如com.whatever.myclient and com.whatever.myserver)。这是完全错误的做法吗?

我也尝试过创建一个Parcel并发送该信息(因此两个应用程序都可以访问该类)-但是Parcel is not Parcelable。我读过有关使用类加载器的信息,但不明白如何在单独的应用程序中分离类加载器(进程,如果我在这方面了解 Android 架构的话)。也就是说,一个类加载器如何“教授”另一个类加载器中存在的类?当然,似乎应该有一个明显的“你就是这样做的”,但我还没有看到它。


您无法在不了解此类的进程中解组该类(正如您已经正确指出的那样)。如果你想MyParcelable发送至您的Service,那么你需要包括MyParcelable in the Service在构建时,and包括权利ClassLoader在解组时使用,因为解组是由系统线程完成的,它不知道什么MyParcelable即使您在编译时包含它也是如此。

EDIT:

(a) 将 MyParcelable 包含到 2 个不同的 pkg 中并让它们可见 作为同一个班级

创建一个公共类库并将其包含在两个应用程序中(应用程序和Service)。您可以将其标记为 Android 库(在 Eclipse 中,它位于项目的 Android 属性下方),也可以将其导出为 JAR 并将其导入到两个应用程序中。拥有它总是一个好主意独立的类放在库中,而不是直接将它们放入应用程序中。这样您就可以在其他项目中重用它们;)

(2) 包含正确的类加载器(我从哪里获得正确的类 装载机,例如)

你可以获得你的ClassLoader当您执行代码时从当前线程。显然这个ClassLoader了解您的类,因为它正在执行您的代码;)例如Activity#onCreate(), 你可以做Thread.currentThread.getContextClassLoader()。自从你的MyParcelable类也包含在Service,你可以做同样的事情来获得有效的ClassLoader解组。

IPC 的另一个解决方案是定义一个AIDL接口 http://developer.android.com/guide/components/aidl.html所以你不必实施Parcelable.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Parcelable 是在应用程序之间发送数据的正确方法吗? 的相关文章

随机推荐

  • 正则表达式查找完整的文本并插入空格

    我正在建立一个论坛 目前处于测试阶段 用户已经开始利用某些东西 例如发布没有空格的长文本字符串 这会拉伸屏幕并破坏某些样式 我刚刚开始使用这段代码并且运行良好 int charIndex 0 int noSpaceCount 0 forea
  • appengine 上的聊天应用程序

    我愿意在 App Engine 上实现一个聊天网站 但我发现App Engine不允许我使用服务器推送 因为它会在 30 秒后终止响应 那么还有什么方法可以 使用 轮询会导致不良用户吗 经验 意味着用户将 需要等待一段时间才能 从服务器检索
  • CSS 缩小并用 gulp 重命名

    我有一个像这样的变量 var files foo css foo min css bar css bar min css 我想要吞咽为我做的是minify文件然后rename for me 但任务目前写为 对于一个文件 gulp task
  • numpy 数组中数字前的冒号

    我正在使用相机将原始数据存储在 numpy 数组中 但我不知道 numpy 数组中数字前面的冒号意味着什么 import numpy as np import picamera camera picamera PiCamera camera
  • Android:当url包含http时,在设置WebViewCore之前不支持removeMessages(int What = 107)

    我编写了一个简单的程序 它将网页加载到网络视图中 URL 包含 http 并且 Web 视图工作得很好 除了这个恼人的 107 错误之外 大多数人说这是因为你的 url 不包含 http 标头 我在网上搜索了所有内容 但找不到与我的情况类似
  • 如何显示完整的数组?

    我得到这个error 对象对象 对象对象 对象对象 我想像这样显示完整的数组 无名氏 安娜 史密斯 彼得 琼斯 h2 Create Object from JSON String h2 p p
  • 如何从函数返回 &Path?

    我试图了解如何编写正确的 Rust 代码 但我认为我可能高估了编译器理解对象生命周期的能力 这是我期望它工作的代码 use std path Path use std env use rusqlite SqliteConnection st
  • Vlookup复制单元格的颜色

    我有以下表格 A B C D 1 Bob 1 6 Football 2 Nate 3 7 Baseball 3 Silver 3 2 Baseball 4 Box 7 1 Cycling A D Bob Nate 我可以成功使用Vlooku
  • “TypeError:‘StratifiedShuffleSplit’对象不可迭代”的原因可能是什么?

    我必须交付一个机器学习项目 我收到了一个名为tester py 在另一个文件中编写完代码后 我必须运行 tester py 才能查看结果 但出现错误 TypeError StratifiedShuffleSplit object is no
  • mysql 选择内部限制

    select id from tableABC limit select count id from tableCBA 1 如果我需要在限制中进行选择 如我在示例代码中所示 我该如何在 mySql 中执行此操作 这只是本论坛的简化代码 否则
  • 设置 MaxTextWidth 时出现 WPF 字对齐问题

    我正在使用 FormattedText 来显示文本 我需要根据提供的选项水平对齐文本 一切正常 直到我设置 MaxTextWidth 属性 我需要它来进行文字修剪 如何在启用文字修剪的情况下对齐文本 FormattedText format
  • 我如何在 C# 中执行 sscanf

    我如何在 C 中执行此操作 int a b c sscanf astring d d d a b c 最少的代码和依赖项是更好的 是否有一些内置的正则表达式的东西 我正在使用 c 4 0 如果像 scannf 一样 您愿意假设用户将提供完全
  • 在 Xcode 中,如何在块内添加断点?

    我有一个返回块的方法 我想在块内添加一个断点 在 Xcode 中 在块内的行上添加断点会导致执行在方法返回时暂停 而不是在执行块时暂停 如何在块内添加断点 我遇到了同样的困难 直到我尝试使用 Xcode 4 的 LLDB 调试器 转到 产品
  • 如何在命令行中使用VLC保存视频流?

    我正在尝试在 Window 7 Basic 的命令行中使用 VLC 保存在线视频 以下是我尝试过并部分起作用的一些事情 I movies gt vlc http media ch9 ms ch9 7492 a92ae0a6 7b81 411
  • C 和 doxygen - 删除变量文档的重复项

    我正在使用 doxygen 记录我的 C 代码 为了更好的可读性 我将每个 c h 文件对 有时还有更多文件 的文档分组为defgroup and addtogroup see c 中的 doxygen 定义分组 https stackov
  • Actionscript 3可以在数组中设置对象的多个变量吗?

    现在我有很多MovieClips在我的数组中 我想更新所有alpha我的数组中 MovieClip 的值 现在 我正在使用 for 循环 但这不是最快的方法 有没有办法为数组中的所有项目设置值 Thanks No ActionScript没
  • 未捕获的类型错误:将 vue 升级到 3.x 后无法读取未定义的属性(读取“扩展”)

    今天我将我的 google chrome 扩展 vue 版本升级到 3 x 当运行该应用程序时 google chrome 扩展弹出控制台显示如下错误 commons1 js 13392 Uncaught TypeError Cannot
  • 在python中使用in运算符搜索列表时使用什么算法?

    当使用 in 运算符搜索列表中的项目时 例如 if item in list print item 使用什么算法来搜索该项目 是从头到尾直接搜索列表还是使用二分搜索之类的东西 list不能假定 s 是按排序顺序 或任何顺序 的 因此二分搜索
  • SHA256 哈希值总是有 64 个字符吗?

    我正在将数据库设置为接收散列密码而不接受纯文本 我会去这样的事情吗 create table User username varchar 20 not null password varchar 64 not null 是的 SHA256
  • 使用 Parcelable 是在应用程序之间发送数据的正确方法吗?

    我试图了解如何在 Android 中的应用程序之间进行通信 而不仅仅是在应用程序之间进行通信Activity实例 我设置了一个 客户端 将 Messenger 对象发送到服务 在Intent发送到服务 该服务创建了一个Messageobj