Я пишу приложение для Android, которое взаимодействует с сервисом RESTful. Этот веб-сервис, по существу, выходит из файловой системы и предоставляет метаданные, а также доступ к файлам с помощью CRUD. Мое приложение извлекает метаданные и предоставляет их сторонним приложениям через ContentProvider
.
Мне нужно добавить способность сторонних приложений, работающих на том же устройстве, что и мое приложение, к CRUD с фактическими файлами, делая запросы в/из моего приложения (а не напрямую с сервера). Это означает, что они должны либо отправлять, либо получать содержимое файлов (которые обычно являются XML или изображениями) через мое приложение.
Я подумал о двух подходах для реализации этого:
Вариант 1 - Использование ContentProvider.openFile
Это кажется очевидным выбором для предоставления сторонним приложениям возможности читать файлы с моего ContentProvider
. Я думаю, что это начинает усложняться, когда эти приложения должны создавать или обновлять файлы через мой ContentProvider. Мне понадобится обратный вызов, когда они будут завершены, чтобы узнать, когда отправить новый/измененный файл обратно на сервер. Я полагаю, что для этой цели я мог бы использовать FileObserver.
Вариант 2 - Использование Messenger через службу
При таком подходе я могу отправить файлы между моим приложением и клиентскими приложениями через Messenger
. Файлы должны быть переданы через Bundle
, поэтому я не уверен, какой лучший формат для их передачи (File
, FileDescriptor
, массив байтов, что-то еще?). У меня нет хорошей справки о том, вызовет ли это проблемы, если файлы станут большими.
Вариант 3 - гибридный подход
- Использовать папку (-ы) на внешней памяти в качестве раскрывающегося списка
- Обмениваться запросами CRUD и отображать содержимое окна с помощью
Messenger
/Service
- Используйте
ContentProvider
для хранения статуса запросов - Стороннее приложение получает обновления статуса через
ContentObserver
Резюме
Я думаю, что использование ContentProvider
было бы идеальным решением, но похоже, что API не полностью поддерживает мой прецедент. Я обеспокоен тем, что попытка спуститься по этому пути может привести к запутанной реализации. Если я использую подход Messenger
и Service
, я не уверен в наиболее надежном способе переноса файлов через Bundle
.
Гибридный подход кажется довольно надежным, но наиболее сложным для реализации. Файлы фактически не передаются, поэтому производительность должна быть хорошей. Однако я боюсь, что это чрезмерное архитектурное решение.
Каков наилучший способ передачи файлов между приложениями, запущенными на одном устройстве Android? Конечно, я открыт для других вариантов, которые я не указал в моем вопросе.