【发布时间】:2011-11-07 16:57:43
【问题描述】:
我正在编写一个与 RESTful 服务交互的 Android 应用程序。这个 Web 服务本质上是一个文件系统的前端,并提供元数据以及对文件的 CRUD 访问。我的应用程序检索元数据,并通过ContentProvider 将其公开给第 3 方应用程序。
我需要添加与我的应用程序在同一设备上运行的第 3 方应用程序的功能,通过向/从我的应用程序发出请求(而不是直接使用服务器)来 CRUD 实际文件。这意味着他们需要通过我的应用程序发送或接收文件的内容(通常是 XML 或图像)。
我想到了两种实现方法:
选项 1 - 使用 ContentProvider.openFile
这似乎是让第 3 方应用程序能够从我的ContentProvider 读取文件的明显选择。我认为当这些应用程序需要通过我的“ContentProvider”创建或更新文件时,它开始变得棘手。当他们完成后,我需要一个回调,以便知道何时将新的/更改的文件发送回服务器。不过,我相信我可以为此使用FileObserver。
选项 2 - 通过服务使用 Messenger
使用这种方法,我可以通过Messenger 在我的应用程序和客户端应用程序之间发送文件。这些文件必须通过Bundle 传递,所以我不确定传输它们的最佳格式是什么(File、FileDescriptor、字节数组,还有什么??)。如果文件变大,我无法很好地处理这是否会导致问题。
选项 3 - 混合方法
- 将外部存储上的文件夹用作投递箱
- 通过
Messenger/Service传达 CRUD 请求和下拉框内容 - 使用
ContentProvider存储请求的状态 - 第三方应用通过
ContentObserver接收状态更新
总结
我认为使用ContentProvider 将是理想的解决方案,但API 似乎并不完全支持我的用例。我担心尝试走这条路可能会导致笨拙的实施。如果我使用Messenger 和Service 方法,我不确定通过Bundle 传输文件的最可靠方法。
混合方法看起来相当健壮,但实施起来最复杂。文件实际上并没有被传递,所以性能应该很好。但是,我担心这会过度构建解决方案。
在同一 Android 设备上运行的应用程序之间传输文件的最佳方法是什么?当然,我愿意接受我的问题中没有列出的其他选项。
【问题讨论】:
-
我会像 Android 那样做。将文件存储在 sdcard 上并通过 ContentProvider 提供对文件 URI 而非文件内容的访问。
-
我只使用选项 1 进行检索,它符合目的。我不认为更新和插入应该更复杂 - 毕竟,你确实有一个与内容提供者的 crud 接口。
-
@mibollma - 我喜欢这个主意,但我不确定它是否能解决整个问题
-
我会先仔细查看文档和来源,看看这个概念是否符合您的需求。至少听起来有些相似。这里是来源:android.git.kernel.org/?p=platform/packages/providers/…
-
@elevine 嵌入一个 3rd 方应用程序可以通过其通信的小型 http 服务器怎么样。所有请求都将通过 localhost。以前没有尝试过,但这似乎是一种简单的方法。
标签: android ipc android-contentprovider android-service