Я пишу приложение для 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? Конечно, я открыт для других вариантов, которые я не указал в моем вопросе.