Рекомендуемые способы создания портативного приложения для Android и других платформ

Я разрабатываю приложение для Android, и я думаю, что его функциональность может быть полезна для других (работающих на Java) платформ (например, обычного настольного приложения), хотя я надеюсь, что другая платформа (-ы) задействована являются несущественными для рассматриваемого вопроса).

Маловероятно, что пользовательский интерфейс будет каким-либо образом переносимым (просто слишком большая разница между хорошим сенсорным интерфейсом, 4-дюймовым пользовательским интерфейсом и пользовательским интерфейсом 19-дюймового экрана мыши и клавиатуры), поэтому я счастлив достаточно переопределить это отдельно.

Однако основные понятия "бизнес-логика" (ugh, horrid word) и модель (хранилище данных) теоретически могут быть использованы при управлении основным приложением. Я заметил, что не так много классов, которые я пишу, которые не приводят ссылки на некоторые биты, специфичные для Android (в качестве примеров я имею файлы XML-ресурсов, изображения и базы данных SQLite). В основном все, что я написал до сих пор, имеет по крайней мере один импорт, связанный с Android.

Мой вопрос двоякий:

  • Какие инструменты доступны, чтобы помочь мне использовать классы и функции, связанные с Android (например, ресурсы, базы данных) на платформах, отличных от Android; и
  • В каких классах, функциях и т.д. платформы Android я должен полностью избегать использования (ради простоты, исключить элементы, связанные с пользовательским интерфейсом) из-за непереносимости, и что я должен использовать вместо этого, чтобы улучшить переносимость.

Ответы, которые состоят из "хахахаха, ты обречен", в порядке, если есть какое-то обоснование.

(P.S. Я бы сделал это сообщество wiki, если это было доступно, это похоже на идеальный CW-вопрос для меня - список советов и инструментов для мобильности Android)

Ответы

Ответ 1

Похоже, что вы уже определили ключевой момент, сохранив логику/модель интерфейса и логики. Также сам sqlite используется не только в Android. Но, конечно, способ взаимодействия с ним (например, SQLDBOpenHelper) снова отличается.

Итак, я думаю, что логика логики и модель как можно более раздельные - это путь. Затем вы можете поместить вокруг него обертку (например, шаблон "Data Access Object", который говорит с конкретной БД).

Имейте в виду, что опыт пользователей лучше всего, когда вы как можно более конкретны для платформы на стороне пользовательского интерфейса. Пример: на Android-рынке есть приложение (Push and Ride), которое, похоже, запускается в эмуляторе J2ME. Таким образом, экранный ввод не использует обычную мягкую (или жесткую) клавиатуру устройства, а имитированную телефонную клавиатуру с комбинациями "abc" "def" на числовых клавишах, что делает ввод данных немного странным. Это приложение, безусловно, очень портативное (и его функциональность действительно замечательная), но он просто не чувствует себя хорошо.

Если вы хотите перейти на многоплатформенную платформу, возможно, вы также можете посмотреть такие вещи, как Appcelerator или Adobe AIR

Ответ 2

Я начал делать что-то подобное - я хотел написать приложение для Android, Blackberry и J2ME. Понятно, что вы можете наложить свой дизайн таким образом, чтобы компоненты платформы (пользовательский интерфейс, сетевой доступ, хранение данных) были отделены от основной бизнес-логики.

На практике я не считаю это удовлетворительным. Проблемы, с которыми я столкнулся, связаны с тем, что основная версия Java отличается на разных платформах (в Blackberry она основана на J2Se 1.4, а Android - на базе Java 6). Это привело к раздражениям вроде

  • Невозможно повторно использовать код, который использует generics
  • Мои предпочтительные классы не доступны равномерно (например, принудительно использовать Vector over List)

Я открыл обсуждения относительно этого на SO (здесь и здесь), но не смог достичь заключение.

Ответ 4

Кроме того, вы можете попробовать это

http://wp7mapping.interoperabilitybridges.com/Home/Library?source=Android

Содержит документацию и инструменты для сопоставления вашего приложения Android с окном телефона

Также ознакомьтесь с этим, хотя в нем содержатся инструкции, специфичные для взаимодействия с телефоном android-windows, а также они также относятся к другим платформам.

http://windowsphone.interoperabilitybridges.com/media/49652/wp7_guide_for_android_application_developers.pdf

Ответ 5

Я создаю веб-сервис за пределами приложения для Android, который может быть использован приложением android, а также другими системами (веб-сайтами, приложениями для Windows, приложениями для iphone и т.д.).

Простая веб-служба REST, которая поддерживает JSON, является хорошим примером для сбора данных, а также для вставки/обновления данных. JSON особенно подходит, потому что он настолько легкий и не требует большой пропускной способности, что отлично подходит для медленных мобильных соединений.

Таким образом, вы можете хранить свои модели/хранилища данных вне приложения Android, и его можно легко использовать другими приложениями.

Ответ 7

Если вы тщательно отделите бизнес-логику от пользовательских интерфейсов и привилегий Android, вы сможете повторно использовать их в среде рабочего стола. Android сильно отличается от него в процессе инициализации и жизненного цикла приложения - требуется также создание абстрактных объектов и настройка BL.

Полезный шаблон для этой цели - это инъекция зависимостей. Существуют разные рамки, и некоторые из них более подходят для андроида (например, roboguice) или рабочего стола (spring или пикоконтейнера или guice).

Приложения Android очень ограничены в памяти, и это ограничивает рамки, которые вы можете использовать там. Таким образом, вам может понадобиться также абстрагировать хранилище данных (спящий режим подходит для настольных компьютеров и серверов, но слишком тяжелый для мобильного устройства).

Ответ 8

Я склонен предлагать попробовать новые родные расширения для Adobe Air. Он позволяет вам создать кусок собственного кода для конкретного устройства и подключить его к инфраструктуре Air, обратившись к нему так же, как и другие объекты в воздухе. (см. http://www.adobe.com/devnet/air/articles/extending-air.html). Это позволяет сохранить код только для Android, как есть, а затем заменить этот код на iOS, Windows DLL и т.д. При необходимости.

Это не решает проблему перевода Java-кода на другие языки/платформы, конечно. Тем не менее, некоторые из логики, которые вы делаете изначально, вполне могут существовать уже на межплатформенной платформе Air. Например, вы можете получить доступ к камере в эфире во всех поддерживаемых операционных системах без написания какого-либо кода для конкретного устройства.

Вам, вероятно, придется выйти за пределы нынешних классов Air, поэтому некоторые примеры могут помочь: