что такое web view в мобильном приложении
Что за программа Android System Webview и для чего она нужна?
Многие пользователи Андроид часто сталкиваются с таким явлением, как Android System Webview. Одни видели это название в списках запущенных приложений, другие же получали уведомление с таким наименованием. В связи с этим и возникают вопросы: что это за приложение или процесс, почему оно просит обновиться, как удалить или остановить и многие другие. И если вы читаете эту статью, значит вам тоже интересно более подробно узнать обо всем этом.
Из статьи вы узнаете
Что это такое?
Android System Webview — служба операционной системы Андроид, которая предустановленна в ней по умолчанию. Она необходима для просмотра страниц в интернете без запуска браузеров. Используется для отображения содержимого сайта внутри приложений. Например, вы загрузили программу с новостями. Все эти новости подгружаются с оригинальных сайтов, однако отображаются не в браузере, а внутри этого самого приложения. Так вот, чтобы такой принцип действия был возможен, и предназначена служба Android System Webview.
Это приложение впервые было установлено в Android 4.2.2 и выше, то есть, в более ранних версиях его не было. Также в сервисе Google Play оно распространяется отдельно и постоянно обновляется, поэтому, если у вас его нет на смартфоне, можно скачать из этого сервиса самую новую версию.
Вообще многие разработчики рекомендуют использовать это приложение только в том случае, если у вас версия Андроид 5.0 и выше, так как оно требует определенное количество ресурсов, тем самым, нагружая лишними процессами ваше устройство. Также поддержка для версий ниже 5.0 прекращена давно, однако многие хакеры используют найденные уязвимости через это приложение, чтобы взламывать смартфоны пользователей.
Какие приложения используют Android System Webview
Некоторые стандартные программы, которые установлены в вашем смартфоне, по умолчанию используют эту службу, чтобы отображать содержимое, например, ICQ Messenger, Google Play Пресса, Puffin Browser и многие другие, поэтому в целом можно сказать, что это неотъемлемая часть в Android, которая необходима для корректного отображения данных в вашем смартфоне.
Но все зависит от версии операционной системы, которая используется в вашем гаджете. Дело в том, что начиная с Android 7 Nougat, Android System Webview больше не используется и по умолчанию отключено. Все опции, которые оно выполняло ранее, теперь дублируются в Google Chrome, собственном браузере от Google. Также часть операций могут и вовсе выполняться через приложения разработчиков, минуя лишние процессы.
Как удалить приложение Android System Webview
Если у вас Android ниже седьмой версии, мы вам категорически не рекомендуем удалять это приложение со своего смартфона, иначе возможны многочисленные сбои в работе, причем о масштабах последствий можно лишь догадываться. Как правило, у вас перестанут работать все службы, связанные с погодой, социальными сетями, часть браузеров. Это один момент.
Второй момент — даже если у вас будет версия выше Андроид 7, необходимо наличие root-прав. Если вы уверены, что оно вам не нужно, удалить можно следующим способом:
Если вы решите заново активировать данную службу, это можно сделать, зайдя в Google Play и скачав его.
Как активировать Android System Webview в Android 7.0 и выше
Как мы уже упоминали ранее, по умолчанию в этой версии используется отдельный механизм от Google Chrome, но если вам нужно включить стандартную службу Android, а именно, Android System Webview, вы можете воспользоваться одним из перечисленных способов.
Первый вариант
Второй вариант
Сразу уточним, что данный вариант немного посложнее, причем иной раз с ним возникают проблемы. Прибегайте к нему только в том случае, если не получилось выполнить действия с первым вариантом.
Возможные проблемы и способы их решения
Иногда на устройстве могут появляться ошибки, которые связаны с этой службой. Мы описали самые известные из них, а также предоставили вам пути их решения.
В приложении произошла ошибка
Если у вас появилась такая надпись, нужно просто очистить данные. Для этого выполните следующие действия:
Необходимо обновить компонент
Это еще одна распространенная проблема, которая может возникать как сама по себе, так и при открытии определенных приложений, например, от Microsoft. Для ее устранения выполните действия:
В случае, если ни один из описанных методов вам не помог, придется сделать полный сброс до заводских настроек. Только обязательно создайте бекап с данными, так как вся информация на устройстве будет удалена.
Android System WebView: все, что вы должны знать об этой скрытой особенности Android
Операционная система Android состоит из небольших бит и частей, и, как пользователь, вы можете наткнуться на такие приложения на вашем устройстве, поэтому вы должны знать, что это за приложение и является ли оно неотъемлемой частью необходимой для работы вашего устройства.
Если на вашем телефоне мало места, и вам необходимо удалить несколько приложений, вы можете решить, что нужно удалить эти приложения, но вы не знаете для чего они нужны и насколько они важны. Лучше не трогать эти приложения, так как их удаление может пагубно отразиться на работе вашего телефона.
Одним из таких системных приложений является Android System WebView, которое можно найти на устройстве с Android, работающее с Android 4.4, KitKat или новее.
Что такое Android System WebView? Что оно делает?
«Android System WebView — это компонент, поддерживающий Chrome, который позволяет приложениям показывать веб-компоненты в приложении, не открывая браузер и не закрывая приложения. Это приложение позволяет сторонним приложениям на вашем устройстве с Android открывать веб-страницы внутри самого приложения, а не открывать веб-страницу в браузере вашего мобильного устройства».
Интересно по теме: Как исправить ошибку: к сожалению, процесс com.android.phone остановлен инструкция здесь.
Без него, вам нужно будет покинуть приложение Facebook и открыть ссылку в веб-браузере. Чтобы перейти обратно в Facebook, вам придется закрыть веб-браузер и снова открыть приложение Facebook. Чтобы упростить этот процесс, Android разработал систему Android WebView, благодаря которой вам не нужно открывать браузер; вы просто нажимаете ссылку, чтобы открыть ее в приложении.
Нужно ли устанавливать Android System WebView?
В Android 4.4 KitKat, WebView был изменен, чтобы сделать его более удобным для пользователей. В Android KitKat он был основан на Chromium и работал аналогично браузеру Chrome. После того, как KitKat преобразовали в Android 5.0 Lollipop, WebView превратился в отдельное приложение в Play Store, чтобы Google мог перенести обновления и исправления ошибок непосредственно в приложение, а не обновлять его из ОС, как раньше.
Google решил сделать его отдельным приложением из-за уязвимостей WebView, которые были замечены на Android 4.3 и старее. Так как теперь это отдельное приложение, то все недочеты могут быть исправлены напрямую, не дожидаясь обновления ОС.
Как пользователю Android, вам не нужно ничего делать, чтобы установить приложение или запустить его. Оно устанавливается по умолчанию и работает в фоновом режиме. Приложение активируется после клика пользователя по ссылке, которую поддерживает WebView. Следует отметить, что не все приложения поддерживают WebView, и поэтому иногда ссылки открываются в браузере.
Можно ли отключить Android System WebView?
Существует опция удаления или отключения приложения на Android. Но это не рекомендуется делать, так как многие приложения используют WebView для открытия встроенных ссылок.
Android System WebView для разработчиков
Если вы разработчик приложений, легко добавить функциональность браузера в ваше приложение, включив в него библиотеку WebView и создав экземпляр класса WebView для добавления браузера в приложение, которое отображает веб-страницы и выполняет JavaScript.
Android System WebView в Android N (Nougat)
Если вы посмотрите на свое устройство Nougat, вы заметите, что приложение Android System WebView на вашем устройстве не активировано. Это связано с тем, что Android N использует Chrome для отображения веб-страниц в приложениях, для экономии батареи.
Используя Chrome как WebView, ваше устройство использует один браузер, вместо того, чтобы поддерживать как WebView, так и Chrome. Согласно Google, этот метод более энергосберегающий, и автономная Android System WebView APK, доступная до Android N, не будет обновляться через Play Store, пока на вашем устройстве доступен Chrome.
Вывод: включить или отключить?
Как и большинство системных приложений, для максимальной производительности, лучше всего поддерживать его по умолчанию. Если ваше устройство работает на Android Marshmallow 6.0 и ниже, лучше всего включить и запустить Android System WebView для лучшей производительности. Однако если ваше устройство работает на Android Nougat 7.0, не включайте его, потому что Chrome заботится о WebView для вас.
Android и iOS WebView-приложения для арбитража трафика: что это такое?
Проработав с WebView более года, я решил поделиться накопленной инфой и подробно описать, что же такое Android / iOS WebView-приложения для арбитража трафика, зачем они нужны и с чем их едят. Отмечу, что я рассматриваю все вопросы в документе исходя из своего скромного опыта исключительно со стороны разработки подобных приложений и не претендую на истину. Документ рассчитан в основном на новичков, но есть нюанс.
Содержание статьи:
Что такое WebView-приложения?
WebView — это системный компонент, который отвечает за открытие веб-страниц в рамках приложений. Иными словами, это то, что вы видите, когда открываете стороннюю ссылку в Telegram или VK.
В рамках арбитража трафика подобные приложения размещаются в Google Play, App Store, либо на сторонних сайтах-одностраничниках, куда затем ведется трафик. Поскольку модераторы подобных площадок не дремлют, в приложения вшивается клоака, которая отсеивает нецелевой трафик и модераторов, показывая им заглушку. Как правило, это какая-то простая игра (match-3, раннер или даже крестики-нолики) либо читалка. Целевым же пользователям показывается WebView с вашим оффером.
Выглядеть страница с приложением в Google Play может примерно так:
Зачем нужны WebView-приложения?
WebView-приложения неспроста стали настолько популярны в последние пару лет. Слив трафика через приложения имеет неоспоримые плюсы.
Первый из них — разнообразие источников трафика. Размещение приложения в сторе позволяет лить на него трафик не только с Facebook, но и с in-app рекламы, а также с UAC.
Второй — возможность «дожимать» пользователя, который попал к нам на оффер. Как правило, в подобные приложения вшиваются сервисы вроде Onesignal, с помощью которых можно отправлять пуш-уведомления прямиком на телефон пользователя, мотивируя его регистрироваться и заносить депозиты.
Третий — траст со стороны пользователей. Приложение на официальной площадке с десятками отзывов и тысячами установок вызывает гораздо больше доверия, чем обычный одностраничник.
Четвертый — подробная статистика. Webview-приложения позволяют использовать SDK для трекинга и аналитики на всю катушку. Appsflyer, Appmetrica, Firebase — you name it.
Такие понятия, как deeplink (диплинк, или отложенная глубокая ссылка), а также нейминг, позволяют вам проводить подробный анализ каждого клика вашего трафика, чтобы определять, с какого крео и благодаря какому баеру вам прилетел деп. Позже мы остановимся на этом подробнее.
Вертикали, в которых используются WebView-приложения
Webview-приложения могут использоваться практически для всех вертикалей. Самая популярная вертикаль на данный момент — гемблинг, однако также подобные прилы используются для дейтинга, крипты, финансов и даже нутры. Особую популярность в последнее время набирает беттинг, вангую, что прилы под беттинг станут трендом 2021 года
Минусы WebView-приложений
Как и у всего в нашем нелегком деле, у работы с WebView-приложениями есть свои нюансы и сложности. Первый и самый важный — баны. Нет, БАНЫ!
Когда я только начинал разрабатывать подобные приложения, они сводили меня с ума. Бан аккаунта разработчика, бан приложения на модерации, бан приложения спустя час после выхода с недельной модерации… Описывать эту дурку можно бесконечно. Но даже если вы разберетесь с причинами банов и настроите качественную клоаку, приложения будут вылетать спустя пару недель активного отлива. Кроме того, периодически, когда Гуглу снова ударит моча в голову, модерация может затягиваться на неделю или даже более, заставляя сердечко разработчика трепетать и снова и снова чекать аккаунт на предмет саспенда или реджекта приложения.
Со временем мы в Apps4You выработали определенный воркфлоу, который позволяет проходить модерацию относительно быстро (2-3 дня) и безболезненно, а приложения в среднем живут от двух недель до месяца. Однако есть рекордсмены в обе стороны. Помимо банов собственно приложений и аккаунтов разработчика, вы можете словить так называемую метку на приложение в Facebook или UAC и не сможете на него лить из этого источника. Вообще. Совсем. Хорошо, что источников может быть несколько! А чтобы жизнь не казалась вам медом, добавлю — баны приложений — это головная боль разработчика, но не забываем про баны аккаунтов в источниках!
Вторая проблема (если вы разработчик) — поиск аккаунта, куда можно вылить свое приложение. Один аккаунт использовать не получится, потому что рано или поздно на него прилетит бан. Для нормальной работы нам нужен постоянный поток аккаунтов. Google ревностно следит, чтобы у одного разработчика не было несколько аккаунтов, и выписывает баны по причине мультиакка налево и направо. Что же делать? Варианта три — использовать VDS, прокси и регистрировать аккаунты самостоятельно, покупать готовые аккаунты у селлеров, либо найти людей, которые за определенную плату будут выливать ваши приложения к себе на аккаунт, пока его не забанят. В свое время я потратил не один месяц, чтобы найти приемлемый алгоритм работы.
Третья проблема (если вы арбитражник) — поиск нормального исполнителя. В настоящий момент рынок перенасыщен приложениями, но качественный сервис оказывают единицы. Как правило, это крупные сервисы. Более того, большая часть приложений заточены под гемблинг, в то время как найти приложение под крипту или беттинг бывает непросто. В поисках подобных приложений можно наткнуться на недобросовестных исполнителей. Многие ребята предпочитают взять предоплату и уйти в закат. Пользуйтесь проверенными сервисами, например, Apps4You, и не забывайте про гаранта, друзья!
Хочу писать приложения!
Для написания WebView-прилок могут использоваться самые разные движки, языки и среды разработки.
Вот самые популярные из них:
В целом, писать можно на чем угодно, хоть на Прологе (нет), поскольку плагины и библиотеки для WebView есть почти везде.
Сам я пишу на Unity (C#), но это лишь потому что моя основная деятельность связана с разработкой игр, и Unity я уверенно владел еще до того, как окунулся в арбитраж. На Unity легко и удобно писать игры-заглушки, поскольку движок изначально заточен под разработку игр, в том числе и на мобильные платформы. Кроме того, Unity кроссплатформенный, что позволяет нам легко и непринужденно разрабатывать приложения как на Android, так и на iOS.
Новичкам, которые никогда не сталкивались с программированием и разработкой в принципе, я могу посоветовать не лезь, она тебя сожрет Android Studio.
Атрибуция и другие умные слова
Раз уж мы переходим к технической части, стоит остановиться на том, как работает диплинк и нейминг.
Клоакинг
Как я уже писал выше, чтобы модераторы не вынесли ваше приложение еще на этапе модерации, важно не показывать им свои истинные намерения и косить под обычную игру/читалку. Приведу лишь пару способов, потому что вариаций масса.
Заглушка
Но что же должно показываться модератору, чтобы он не настучал нам по попке? Если заглушка будет недостаточно качественной, это тоже может послужить причиной бана. Графон может быть супер убогим и стоковым, главное, чтобы в приложении был хотя бы примитивный рабочий геймплей, а описание приложения хотя бы косвенно совпадало с его содержимым. Так, для приложений под подписку на фоторедактор мы разработали простенький фоторедактор, а для гембловых приложений достаточно каких-нибудь игр. Заглушки не должны быть слишком простыми или похожими друг на друга и прочие игры в маркете, иначе можно получить по жопе.
Прикрепляю пару скриншотов рабочих заглушек, надеюсь, вы не дропнете документ после увиденного!
Полезная информация от автора
Статья написана представителем сервиса аренды-продажи webview-приложений Apps4You.
Промокод дающий скидку в 50$ на выкуп прилки «traffink»
Поделиться ссылкой:
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Android System Webview что это за программа и как её включить?
Добрый день. Android System Webview как включить приложение? Первым делом, давайте вначале разберем, что это за приложение и ли нужен ли Android system webview?
Многие пользователи системы Андроид замечали на своём гаджете подобное приложение. Что интересно, большинство из них понятия не имеют, что это за приложение и вообще, что это такое? Также, что с ним делать. Запустить его, или удалить? Обычно данное приложение устанавливается на версии системы ниже 7,0. Если Андроид старой версии, программа будет просить обновления. Итак, давайте рассмотрим подробности.
Нужен ли Android System Webview?
Данное приложение представляет специальную программу ОС Android. Она устанавливается заводом изготовителем. Эта служба необходима, чтобы просматривать сайты в интернете и, при этом, не запускать браузеры. То есть, применяется, чтобы отображать статьи сайтов внутри самой программы, не применяя браузер.
К примеру, можно включить программу с новостным контентом. Данные новостные сообщения будут грузиться с ресурсов оригиналов, но показываться они станут в этом приложении. Вот именно для подобной загрузки и создан софт Android System.
Первый раз программа появилась в версии Андроид 4.2.2, далее, по возрастающей. До этой версии в операционной системы приложения System Webview не существовало.
Но, данное приложение до сих пор можно скачать с Гугл Плей в разных вариантах обновления. Отсюда, если на вашем гаджете её нет, её можно взять с Google Play. А именно, последнюю версию.
Но, лучше всё же использовать данный софт от Android 5.0, ниже не рекомендуется в связи с затратой определённого объёма ресурса телефона, чтобы лишний раз не нагружать процессор. Кроме этого, техподдержка версии 5.0 отсутствует. Отсюда, часть вредителей и вирусов стараются найти дыры в устаревшей система Андроид и взломать телефон используя этот софт.
Android System Webview как включить приложение?
Во многих устройствах данная программа отключена, и люди не знают, как его можно включить. Всё очень просто. Уже с версии системы Андроид 7 Nougat приложение перестали применять, и ещё на уровне заводских настроек его отключили. Теперь, подобные функции применяются с использованием механизмов Хрома или других средств. Поэтому, особой необходимости включать данное приложение нет.
Но, если вам очень нужно его включить в версиях Андроид от 7 и выше, рассмотрим два способа.
Способ 1 включения System Webview
Нужно запомнить, что как только мы снова включим браузер Хром, приложение сразу выключится. Данное приложение не работает синхронно ни с одним из браузеров.
Способ 2 включения Webview (более сложный, не всегда срабатывает)
Что за программы применяют приложение System Webview?
Часть софта, который находится в системе гаджета и установлен на заводе изготовителе может использовать данное приложение. Например, «Гугл Пресса», ICQ Messenger, Puffin Browser и прочие. Все эти программы нужны смартфону для правильного отображения информации.
Сейчас, после отключения разработчиком этого приложения, часть его функций выполняются Хромом или другими программами для увеличения скорости показа данных.
Как удалить System Webview
Стоит ли удалять данную программу, нужно подумать. Например – вы имеете на Андроид версию системы, ниже 7. В таком случае, лучше это приложение не удалять. В противном случае могут возникнуть различные системные сбои. Скорее всего, на вашем гаджете больше не будут функционировать приложения, показывающие погоду, или дающие возможность входа в соц. сети. Даже некоторые браузеры перестанут работать.
Кроме этого, нужны Рут права на вашем гаджете. Но, если всё же вы решили непременно удалить Webview, делаем следующее:
Может случиться так, что возникнет необходимость снова запустить функцию. В этом случае вначале ищем его в Гугл Плее и скачиваем. Далее, запускаем приложение, как описано выше. Теперь вы знаете, как включить Android System Webview. Успехов!
Android WebView: актуальные проблемы и их решение
На прошедшей встрече AndroidDevs Meetup выступили несколько разработчиков из команды мессенджера ICQ. Мой доклад был посвящен Android WebView. Для всех, кто не смог приехать на встречу, публикую здесь статью по мотивам выступления. Пойду по верхам, крупными штрихами. Глубоких технических деталей и много кода давать не буду. Если вас заинтересуют подробности, по ссылке в конце поста можно скачать приложение, специально написанное в качестве иллюстрации, и все увидеть на примерах.
Что такое WebView?
WebView — это компонент платформы Android, который позволяет встраивать web-страницы в Android-приложения. По сути, это встраиваемый браузер. При помощи WebView примерно год назад мы решили создать ICQ Web API для интеграции web-приложений в наш мессенджер. Что представляет собой web-приложение? По сути, это HTML-страница, которая содержит JavaScript и работает внутри ICQ. Используя ICQ Web API, web-страницы через JavaScript могут отдавать ICQ разные команды, допустим, на отправку сообщений, открытие чата и т.п.
Вот как это выглядит в ICQ. Из пункта Applications можно перейти в список приложений. Это пока еще не WebView, чтобы попасть в него, нужно выбрать одно из приложений. Тогда мы переходим непосредственно в WebView, куда web-приложение загружается из сети.
Как это устроено технически? У WebView есть возможность определенным образом инжектировать Java код в JavaScript. JavaScript может вызывать код, который мы написали и предоставили ему. Это возможность, на которой и основан весь ICQ Web API.
Здесь показано, что внутри ICQ работает WebView, между ними есть инжектированный Java-класс, а в WebView загружаются приложения из сети.
Итак, JavaScript из WebView делает вызовы к Java-коду ICQ. Существует большое число различных вызовов, и в процессе разработки встретилось множество проблем, связанных с работой этого механизма, о которых я и расскажу далее.
Проблемы при работе с WebView
После старта загрузки обычно бывает нужно проконтролировать этот процесс: узнать, успешно ли прошла загрузка, были ли редиректы, отследить время загрузки и другие вещи. Также будет сказано о потоках, в которых работает JavaScript и вызовы в Java, о несоответствии типов Java и JavaScript, поведении Alerts в JavaScript и размерах передаваемых данных. Решение для этих проблем будет также описано дальше.
Основы WebView
В двух словах об основах WebView. Рассмотрим четыре строки кода:
Тут видно, что мы получаем WebView и загружаем в него сайт example.com, вызвав WebView.loadURL(). В Android есть два важных класса: WebViewClient и WebChromeClient, которые взаимодействуют с WebView. Зачем они нужны? WebViewClient требуется для того, чтобы контролировать процесс загрузки страницы, а WebChromeClient — чтобы взаимодействовать с этой страницей после того, как она успешно загружена. До завершения загрузки страницы работает WebViewClient, а после — WebChromeClient. Как видно в коде, для того чтобы взаимодействовать с WebView, нам нужно создать собственные инстансы этих классов и передать их в WebView. Далее WebView при определенных условиях вызывает разные методы, которые мы переопределили в наших инстансах, и так мы узнаем о событиях в системе.
Наиболее важные методы, которые WebView вызывает у созданных нами инстансов WebViewClient и WebChromeClient:
WebViewClient | WebChromeClient |
---|---|
onPageStarted() | openFileChooser(), onShowFileChooser() |
shouldOverrideUrlLoading() | onShowCustomView(), onHideCustomView() |
onPageFinished(), onReceivedError() | onJsAlert() |
О назначении всех этих методов буду рассказывать немного позднее, хотя из самих названий уже многое понятно.
Контроль загрузки страницы в WebView
После того, как мы отдали WebView команду на загрузку страницы, следующим шагом нужно узнать результат выполнения: загрузилась ли страница. С точки зрения официальной Android-документации, все просто. У нас есть метод WebViewClient.onPageStarted(), который вызывается, когда страница начинает загружаться. В случае редиректа вызывается WebViewClient.shouldOverrideUrlLoading(), если страница загрузилась — WebViewClient.onPageFinished(), если не загрузилась — WebViewClient.onReceivedError(). Все кажется логичным. Как это происходит на самом деле?
Инжектирование кода Java в JavaScript
Пример кода JavaScript:
Здесь показан пример инжектирования кода Java в JavaScript. Создается коротенький Java-класс MyJavaInterface, и у него есть один единственный метод getGreeting(). Обратите внимание, что этот метод помечен маркирующим интерфейсом @JavaScriptInterface — это важно. Вызывая метод WebView.addJavascriptInterface(), мы пробрасываем данный класс в WebView. Ниже мы видим, как к нему можно обращаться из JavaScript, вызвав test.getGreeting(). Важным моментом здесь является имя test, которое впоследствии в JavaScript будет использовано как объект, через который можно делать вызовы к нашему Java-коду.
Если мы поставим breakpoint на строку return «Hello JavaStript!» и посмотрим имя потока, в котором получен вызов, какой это будет поток? Это не UI-поток, а специальный поток Java Bridge. Следовательно, если при вызове каких-то методов Java мы хотим манипулировать с UI, то нам нужно позаботиться о том, чтобы эти операции передавались в UI-поток — использовать хэндлеры или любой другой способ.
Второй момент: Java Bridge поток нельзя блокировать, иначе JavaScript в WebView просто перестанет работать, и никакие действия пользователя не будут иметь отклика. Поэтому если нужно делать много работы, задачи нужно также отправлять в другие потоки или сервисы.
Несоответствие типов Java в JavaScript
С передачей в обратную сторону, из JavaScript в Java, тоже есть нюансы. Если вызывать какой-то метод, имеющий параметрами элементарные типы, то можно передать туда number. А если среди параметров метода есть не элементарные типы, а скажем, объектные обертки, такие как Integer, то такой метод не будет вызван. Поэтому нужно пользоваться только элементарными типами Java.
Размеры данных, передаваемых между Java и JavaScript
Еще одна существенная проблема связана с объемом передаваемых данных между Java и JavaScript. Если передается достаточно большой объем данных (например, картинки) из JavaScript в Java, то при возникновении ошибки OutОfMemory, поймать ее не получится. Приложение просто падает. Вот пример того, что можно увидеть в logcat в этом случае:
Как видите, если в приложении происходит OutOfMemory, то начинают вылетать различные другие приложения, запущенные на устройстве. В итоге, закрыв все что можно, Android доходит до нашего приложения, и, так как оно находится в foreground, закрывает его последним. Еще раз хочу напомнить, что никакого исключения мы не получим, приложение просто упадет. Чтобы этого не происходило, необходимо ограничивать размер передаваемых данных. Многое зависит от устройства. На некоторых гаджетах получается передавать 6 мегабайт, на некоторых 2-3. Для себя мы выбрали ограничение в 1 мегабайт, и этого достаточно для большинства устройств. Если нужно передать больше, то данные придется резать на чанки и передавать частями.
JavaScript Alerts
По умолчанию диалог Alert в WebView не работает. Если загрузить туда страницу HTML с JavaScript и выполнить alert(‘Hello’), то ничего не произойдет. Чтобы заставить его работать, нужно определить свой инстанс WebChromeClient, переопределить метод WebChromeClient.onJSAlert() и в нем вызвать у него super.onJSAlert(). Этого достаточно, чтобы Alerts заработали.
Обработка изменения ориентации устройства
Ещё одна серьезная проблема связана с портретной и альбомной ориентацией. Если поменять ориентацию устройства, то по умолчанию Activity будет пересоздана. При этом все View, которые к ней прикреплены, тоже будут пересозданы. Представьте ситуацию: есть WebView, в который загружена некая игра. Пользователь доходит до 99 уровня, поворачивает устройство, и инстанс WebView с игрой пересоздается, страница загружается заново, и он снова на первом уровне. Чтобы этого избежать, мы используем мануальную обработку смены конфигурации устройства. В принципе, это вещь известная и описана в официальной документации. Для этого достаточно прописать в AndroidManifest.xml в разделе активити параметр configChanges.
Это будет означать, что мы сами обрабатываем смену ориентации в activity. Если ориентация изменится, мы получаем вызов Activity.onConfigurationChange() и можем поменять какие-то ресурсы программно. Но обычно activity с WebView имеют только сам WebView, растянутый на весь экран, и там ничего делать не приходится. Он просто перерисовывается и все продолжает нормально работать. Таким образом, установка configChanges позволяет не пересоздавать Activity, и все View, которые в нем присутствуют, сохранят свое состояние.
Полноэкранный медиаплеер
Если в web-страницу встроен медиаплеер, то часто возникает потребность обеспечить возможность его работы в полноэкранном режиме. Например, медиаплеер youtube может работать внутри web-страницы в html-теге iframe, и у него есть кнопка переключения в полноэкранный режим. К сожалению, в WebView по умолчанию это не работает. Чтобы заставить это работать, нужно сделать несколько манипуляций. В xml layout, в котором расположен WebView, разместим дополнительно FrameLayout. Это контейнер, который растянут на весь экран и в котором будет находится View с плеером:
А затем в своем инстансе WebChromeClient переопределим несколько методов:
Система вызывает WebChromeClient.onShowCustomView(), когда юзер нажимает на кнопку перехода в полноэкранный режим в плеере. оnShowCustomView() принимает View, которое и репрезентует сам плеер. Этот View вставляется в FullScreenContainer и делается видимым, а WebView скрывается. Когда пользователь хочет вернуться из полноэкранного режима, вызывается метод WebChromeClient.onHideCustimView() и проделывается обратная операция: отображаем WebView и скрываем FullScreenContainer.
Input type=”file”
Web-разработчики знают, что этот контейнер используется на web-страницах для того, чтобы пользователь мог выбрать какой-то файл и загрузить его на сервер, либо показать на экране. Для работы этого контейнера в WebView нам нужно переопределить метод WebChromeClient.openFileChooser(). В этом методе есть некий callback, в который нужно передать файл, выбранный пользователем. Никакого дополнительного функционала сам по себе /> не имеет. Диалог выбора файла нам нужно обеспечить. То есть мы можем открыть любой стандартный Android picker, в котором пользователь выберет нужный файл, получить его, например, через onActivityResult(), и передать в callback метода openFileChooser().
Пример кода JavaScript:
Определение состояния сети в JavaScript
В JavaScript есть полезный объект Navigator. У него есть поле onLine, показывающее статус сетевого подключения. Если у нас есть подключение к сети, в браузере это поле имеет значение true, в противном случае — false. Чтобы оно работало корректно внутри WebView, необходимо использовать метод WebView.setNetworkAvailable(). С его помощью мы передаем актуальное сетевое состояние, которое можно получить при помощи сетевого broadcast receiver или любым другим способом, которым вы трекаете сетевое состояние в Android. Делать это нужно постоянно. Если сетевое состояние изменилось, то нужно заново вызвать WebView.setNetworkAvailable() и передать актуальные данные. В JavaScript мы будем получать актуальное значение этого свойства через Navigator.onLine.
Примеры кода
Вопросы и ответы
Вопрос: Есть проект CrossWalk — это сторонняя реализация WebView, позволяющая на старых устройствах использовать свежий Chrome. У вас есть какой-то опыт, вы пробовали его встраивать?
Ответ: Я не пробовал. На текущий момент мы поддерживаем Android начиная с 14-й версии и уже не ориентируемся на старые устройства.
Вопрос: Как вы боретесь с артефактами, которые остаются при прорисовке WebView?
Ответ: Мы с ними не боремся, пробовали — не получилось. Это происходит не на всех устройствах. Решили, что это не настолько вопиющая проблема, чтобы тратить на нее больше ресурсов.
Вопрос: Иногда требуется WebView вложить в ScrollView. Это некрасиво, но иногда требуется по заданию. Это не поощряется, даже где-то запрещается, и после этого возникают недостатки в работе. Но все равно иногда это приходится делать. Например, если вы сверху рисуете WebView, а под ним рисуете какой-то нативный компонент (который должен быть нативным согласно требованию), и все это должно быть выполнено в виде единого ScrollView. То есть сначала пользователь посмотрел бы всю страничку, а потом, если бы захотел, то долистал бы до этих нативных компонентов.
Ответ: К сожалению, не могу вам ответить, потому что я не сталкивался с такой ситуацией. Она довольно специфическая, и представить себе вариант, когда нужно WebView положить в ScrollView, мне сложно.
Вопрос: Есть почтовое приложение. Там сверху шапка с получателями и со всем остальным. Даже в этом случае не все будет гладко. У WebView возникают большие проблемы, когда он пытается определить свой размер внутри ScrollView.
Ответ: Можно попробовать отрисовать означенную часть UI внутри WebView.
Вопрос: То есть полностью перенести всю логику из нативной части в WebView и оставить эти контейнеры?
Ответ: Даже, может быть, логику переносить не надо, имеется в виду инжектирование Java-классов. Логику можно оставить и вызывать через инжектированный класс. В WebView можно перенести только UI.
Вопрос: Вы упоминали про игры в мессенджере. Они представляют собой web-приложения?
Ответ: Да, это web-страницы с JavaScript внутри WebView.
Вопрос: Вы все это делаете, чтобы просто не переписывать игры нативно?
Ответ: И для этого тоже. Но основная идея в том, чтобы дать сторонним разработчикам возможность создавать приложения, которые могут встраиваться в ICQ, и с помощью этого ICQ Web API взаимодействовать с мессенджером.
Вопрос: То есть в эти игры можно играть также через web-браузер на лэптопе?
Ответ: Да. Она может быть открыта в web-браузере, и мы иногда их прямо в нем и отлаживаем.
Вопрос: А если Intent, допустим, в Chrome прокинуть эту игрушку, какие проблемы тогда будут? Если не свою WebView писать, а воспользоваться услугами?
Ответ: Проблема в том, что в своем WebView мы можем предоставить API через инжектирование Java-класса, и с помощью этого API приложение сможет напрямую взаимодействовать с ICQ, отправлять ему различные команды. Допустим, команду на получение имени пользователя, на получение чатов, которые у него открыты, отправлять сообщения в чат непосредственно из ICQ. То есть из Chrome отправлять сообщения непосредственно в ICQ не получится. В нашем случае все это возможно.
Вопрос: Вы упомянули, что режете данные на куски по одному мегабайту. Как вы их потом собираете?
Ответ: Мы сейчас этого не делаем, потому что у нас нет такой потребности.
Вопрос: Хватает одного мегабайта?
Ответ: Да. Если картинки больше, то пытаемся их ужимать. Я сказал о том, что если такая потребность существует, то это может быть решением — разрезать и собирать потом в Java.
Вопрос: Как вы обеспечиваете безопасность работы приложений в песочнице? Правильно ли я понял, что из JavaScript приложения нужно вызывать инжектированные Java-классы?
Ответ: Да.
Вопрос: Как будет обеспечиваться в этом случае безопасность, запрещен ли доступ к каким-то системным функциям?
Ответ: Прямо сейчас, так как система еще довольно молодая, у нас в основном используются наши собственные web-приложения, и мы им полностью доверяем. В дальнейшем все приложения, которые будут поступать к нам, будут администрироваться, код будет просматриваться, для этого выделена специальная Security Team. Дополнительно будет создана специальная система разрешений, без которых приложения не смогут получить доступ к какой-то критической для пользователя информации.