Мы начнем с базового проекта Android и покажем, как добавить гибридные компоненты, которые можно внедрить в любое существующее приложение для Android! Для видео-версии этого урока прокрутите страницу вниз.
В гибридном приложении есть два основных компонента: нативный код (платформы Java и Android), а также веб-код (HTML / CSS / JavaScript). Мы сосредоточимся на аспектах Android и рассмотрим, что нужно сделать обеим сторонам, чтобы беспрепятственно общаться друг с другом.
Чтобы узнать немного больше о том, что означает Гибрид, посмотрите этот пост в блоге и видео .
В этой демонстрации мы создадим базовый опыт мобильной коммерции. Пользователь может просматривать список продуктов, отображаемых в WebView, а корзина и процесс оформления заказа обрабатываются изначально. Это обычный случай использования, который идеально подходит для демонстрации преимуществ каждой платформы.
Давайте начнем!
Android
Как минимум, нам нужна встроенная оболочка для хранения веб-части нашего приложения. Наша демонстрационная версия будет примерно 30/70 веб / нативная, поэтому нам нужно выполнить некоторые настройки и нативную реализацию. Тем не менее, имейте в виду, что вы можете сделать свое приложение любой комбинацией веб / родной — все зависит от вас и вашего варианта использования!
Получить код
Перво-наперво, захватите исходный код здесь . В демо- ветке есть пробелы в коде, которые мы будем заполнять в этом уроке, если вы хотите следовать им. В противном случае проверьте ветку master, и у вас будет готов весь готовый код.
Настройте проект Android
В оболочке демонстрационного приложения большая часть пользовательского интерфейса уже настроена. Есть две вкладки или фрагменты: ShopFragment и CartFragment. ShopFragment содержит WebView, поэтому мы покажем, как это настроить.
Добавление веб-вида
Откройте файл res / layout / frag_shop.xml в любом редакторе. Введите код ниже в теге RelativeLayout:
<WebView
android:id="@+id/shop_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Код прост и создает полноэкранный WebView в своем контейнере. Обратите внимание на определение android: id , которое мы будем использовать для привязки этого элемента пользовательского интерфейса в нашем коде.
Настройка WebView в коде
Далее мы закончим настройку WebView, отредактировав файл ShopFragment.java . В методе onCreateView вставьте следующий код в Placeholder 1 :
mWebView = (WebView) rootView.findViewById(R.id.shop_webview);
Это связывает переменную класса mWebView с элементом пользовательского интерфейса, который мы только что создали в нашем макете. Теперь, когда мы можем получить доступ к WebView из кода, мы можем загрузить в него URL. Для этого введите следующий код в Placeholder 2 :
mWebView.loadUrl(APIRequest.BASE_URL);
Если вы проверяете APIRequest.BASE_URL , вы заметите веб-URL — это URL-адрес, который будет загружен в наш WebView, но вы также можете проверить его в своем браузере на рабочем столе.
Запустите приложение, чтобы увидеть, что мы имеем до сих пор. Обойдите продукты и перепрыгните, чтобы просмотреть корзину. Вы заметите, что кнопки «Добавить в корзину» не совсем работают, но мы вернемся к этому позже
Web
В этой демонстрации веб-компонент отображает все продукты в интерфейсе с возможностью просмотра. Проект построен на веб-фреймворке Django в Python, а внешний интерфейс построен на HTML / CSS и Javascript. Также есть несколько API, все они созданы для демонстрационных целей, поэтому они максимально упрощены. Имейте в виду, что вы можете использовать веб-фреймворки по вашему выбору, мы просто выбрали Django и стандартный JavaScript.
Получить код
Как и во всех сногсшибательных демонстрациях, код также имеет открытый исходный код, так что вы можете загрузить веб-версию и поработать с ней самостоятельно. Проверьте проект Github, чтобы загрузить веб-код полностью.
Примечание . Веб-код находится в другом хранилище, чем упомянутый ранее нативный код.
Запустите его локально
Если вы хотите запустить веб-код локально, вы, безусловно, можете! Ознакомьтесь с документацией по Django, чтобы узнать немного больше и установить все на своем локальном компьютере.
Мы развернули этот демонстрационный код в Heroku по адресу http://critterretail.herokuapp.com/ . Вы можете изменить URL-адрес, используемый проектом в APIRequest.java, в переменной BASE_URL, если вы хотите указать его для своего собственного экземпляра.
Примечание. Если вы используете сервер локально в эмуляторе Genymotion, обязательно используйте BASE_URL по адресу http://10.0.3.2:8000/.
Соединение Сети и Android
Теперь у нас есть код, работающий на двух разных платформах, в Интернете и на Android — все в одном приложении. Чтобы создать отличный опыт для наших пользователей, нам нужно каким-то образом связать эти платформы.
В нашем демонстрационном приложении, когда вы добавляете товар в корзину (в WebView), он загружает товар в собственную базу данных для оформления заказа (на стороне Android). Мы покажем, что должно произойти с обеих сторон, чтобы добиться этого!
На веб-стороне
В веб-коде, если вы откроете critterretail / templates / index.html, вы увидите ссылку в строке 36-37. Это ключ к общению с приложением Android:
<a class="btn btn-success" style="width:100%;"
href="apprequest://addtocart#{{p.productJSON}}">Add to Cart</a>
Когда вы нажимаете на ссылку, происходит перенаправление на URL, который выглядит следующим образом:
apprequest://addtocart#{'productID':4}
JSON визуализируется кодом Python и зависит от того, какая кнопка была нажата, что делает этот запрос динамическим.
Вы заметите, что URL — это не запрос http: //, а apprequest: // , и для этого есть веская причина. Давайте вернемся к коду Android, чтобы собрать все вместе.
На стороне Android
Откройте ShopFragment.java и перейдите к методу onCreateView . Вы найдете невыполненный WebViewClient . Замените Placeholder 3 кодом, показанным ниже:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// Example request apprequest://addtocart#{'itemID':1}
if (url.startsWith("apprequest://")) {
Uri uri = Uri.parse(url);
// example host == apprequest
String command = uri.getHost();
// example fragment == {'itemID':1}
String jsonString = uri.getFragment();
try {
// parse the fragment and handle the full request
JSONObject json = new JSONObject(jsonString);
handleRequest(command, json);
} catch (JSONException e) {
Crittercism.logHandledException(e);
}
return true;
}
return false;
}
Здесь много чего происходит, но метод, который мы переопределяем, вызывается каждый раз, когда URL собирается загрузить в WebView. Перехватывая это, мы можем искать пользовательские запросы (то есть запросы, которые начинаются с apprequest: // вместо http: // ) и обрабатывать их отдельно.
Прочитав комментарии к коду, вы можете заметить, как анализируется URL-адрес и как создавать свои собственные пользовательские запросы на веб-стороне. Прокрутите вверх, чтобы просмотреть метод handleRequest для изменения или добавления новых команд!
Запустите приложение еще раз и добавьте товар в корзину, и это работает! Веб-приложение в WebView успешно взаимодействует с кодом в собственном представлении.
Кроссплатформенный мониторинг производительности
Отслеживание проблем достаточно сложно на одной платформе, но как только вы задействуете несколько платформ в одном приложении, будет очень сложно определить узкие места в производительности вашего приложения. К счастью, решение Crittercism App Intelligence обеспечивает понимание как веб-страниц, так и нативных сторон вашего приложения, и оно уже реализовано в демоверсии!
От отчетов о сбоях и обработки исключений до мониторинга сервисов API и бизнес-транзакций вы теперь можете получить представление о производительности собственных и веб-компонентов гибридного приложения из единого интегрированного решения.
Завершение
С помощью этого руководства вы можете взять существующее приложение для Android и добавить в него гибридные компоненты. Благодаря возможности обмениваться данными между веб-сайтами и нативными платформами, вы можете создавать самые разные варианты использования — так что начинайте и начинайте строить!
Если вы хотите загрузить законченный код из этого учебного пособия, вы можете сделать это, проверив главную ветвь этого проекта Github .