我正在编写一个与 RESTful 服务交互的 Android 应用程序。该 Web 服务本质上是一个文件系统,并提供元数据以及对文件的 CRUD 访问。我的应用程序检索元数据,并通过ContentProvider
.
我需要添加与我的应用程序在同一设备上运行的第 3 方应用程序的功能,通过向我的应用程序发出请求(而不是直接向服务器发出请求)来 CRUD 实际文件。这意味着他们需要通过我的应用程序发送或接收文件内容(通常是 XML 或图像)。
我想到了两种实现此目的的方法:
选项 1 - 使用 ContentProvider.openFile
这似乎是一个显而易见的选择,让第三方应用程序能够从我的应用程序读取文件ContentProvider
。我认为当这些应用程序需要通过我的“ContentProvider”创建或更新文件时,事情就开始变得棘手。当它们完成时,我需要回调,以便知道何时将新的/更改的文件发送回服务器。我相信我可以使用文件观察器 http://developer.android.com/reference/android/os/FileObserver.html不过为了这个目的。
选项 2 - 通过服务使用 Messenger
通过这种方法,我可以通过以下方式在我的应用程序和客户端应用程序之间发送文件Messenger
。这些文件必须通过Bundle
,所以我不确定传输它们的最佳格式是什么(File
, FileDescriptor
、字节数组、其他东西??)。我不太清楚如果文件变得很大这是否会导致问题。
选项 3 - 混合方法
- 使用外部存储上的文件夹作为投递箱
- 通过一个通信 CRUD 请求和投递箱内容
Messenger
/Service
- Use the
ContentProvider
存储请求的状态
- 3rd 方应用程序通过接收状态更新
ContentObserver
Summary
我认为使用ContentProvider
将是理想的解决方案,但该 API 似乎并不完全支持我的用例。我担心尝试走这条路可能会导致实施过程的混乱。如果我和一个Messenger
and Service
方法,我不确定通过传输文件的最可靠的方法Bundle
.
混合方法看起来相当强大,但实施起来最复杂。文件实际上并没有被传递,所以性能应该很好。然而,我担心这对解决方案进行了过度设计。
在同一 Android 设备上运行的应用程序之间传输文件的最佳方法是什么?当然,我对我的问题中没有概述的其他选择持开放态度。
内容提供商绝对是一条出路。如果您认为谷歌几乎在所有事情上都使用这种方法,那么显然这就是预期的设计方法。
我并不是在赞扬他们的美德,但在盲人的土地上,独眼内容提供商才是王道。
Update
CommonsWare 书中有一个如何执行此操作的示例,请参阅提供的链接。
内容提供商/文件的来源 https://github.com/commonsguy/cw-advandroid/tree/master/ContentProvider/Files
使用内容提供商的同步框架。只需维护请求列表,然后安排同步来下载这些文件。您还可以在网络上执行此操作等。您可以使用广播意图或内容观察器来通知客户端文件已下载。
本质上,这可能与您的第三个选项类似,但重要的是它使用 Android 提供的工具,而不是您自己的工具。
Ad Endum
最好的起点是 android-sdk\samples\android-8\SampleSyncAdapter 中的 android SDK 示例,但请注意,有大量与联系人相关的内容掩盖了有趣的部分。我花了一段时间才发现我可以删除除同步适配器之外的几乎所有内容
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)