Взаимодействие между js и нативом делится на две ситуации: js вызывает нативные методы, а натив вызывает методы js.
В этой статье эти два случая будут объяснены отдельно, конечное использование H5vue
выполнить.
1. Предварительная подготовка (подготовка проекта Vue)
В конце H5 этой статьи используетсяVue
реализации, поэтому перед официальным стартом поставьтеVue
Среда проекта готова.
После того, как проект написан, выполнитеnpm run serve
Команда запускает проект, после успешного запуска вы увидите два адреса в командной строке:
http://localhost:8080/
иhttp://10.0.0.188:8080/
10.0.0.188
это моя машинаip
Адрес у всех разный.
Любой из них подойдет, если вы получаете к нему доступ из браузера компьютера, но если вы получаете доступ к нему с мобильного телефона или эмулятора, вам нужно использовать второй диапазон.ip
адрес и убедитесь, что телефон и компьютер подключены к одному и тому жеwifi
или в том же сегменте сети.
Примечание: здесь используется vue-cli 3.0, а команда запуска отличается от vue-cli 2.X. Для получения подробной информации, пожалуйста, проверьте официальную документацию самостоятельно.
После успешного запуска в проекте Android появитсяhttp://10.0.0.188:8080/
адрес настроен наWebView
Просто
Intent intent = new Intent(getActivity(), ProgressWebviewActivity.class);
intent.putExtra("url", "http://10.0.0.188:8080/");
startActivity(intent);
На данный момент вы можете получить к нему доступ на своем мобильном телефонеVue
проект.
2. Android нативно вызывает методы в JS
Android может вызывать JS двумя способами: оба черезWebView
Методы:
webview.loadUrl()
webview.evaluateJavascript()
Разница между ними:
loadUrl()
обновит страницу,evaluateJavascript()
не приведет к обновлению страницы, поэтомуevaluateJavascript()
более эффективным
loadUrl()
Не удается получить возвращаемое значение js,evaluateJavascript()
получить возвращаемое значение
evaluateJavascript()
Доступно только после Android 4.4
Достигаемый эффект:
Как показано на рисунке ниже, на странице есть строка текста «ха-ха».WebView
Когда страница загружена, нативный код Android изменит эту строку на «Я изменил текст с помощью нативного метода» + параметры, переданные Android, и вернет Android строку «JS-вызов выполнен успешно».
2.1 Vue-код
Сначала посмотрите, как писать код на Vue.
mounted() {
//将要给原生调用的方法挂载到 window 上面
window.callJsFunction = this.callJsFunction
},
data() {
return {
msg: "哈哈"
}
},
methods: {
callJsFunction(str) {
this.msg = "我通过原生方法改变了文字" + str
return "js调用成功"
}
}
существуетmethods
Определите метод вызова AndroidcallJsFunction(str)
, и может получить параметрstr
, а затем измените текст на странице.
если только вmethods
Метод, определенный в , собственный вызов не найдет этот метод. Итак, когда страница загружается, смонтируйте метод вwindow
вверх, такWebView
Вы можете получить этот метод. Обратите внимание, что этот шаг очень важен и должен быть записан!
Обратите внимание на одну деталь,this.callJsFunction
Не ставить скобки после()
, добавление круглых скобок эквивалентно прямому вызову.
подвести итогVue
Нужно сделать два шага:
- существует
methods
метод, определенный в - существует
mounted
смонтировать метод вwindow
начальство
2.2 Код в Android
Нужно дождаться загрузки страницыWebView
изonPageFinished
Пропишите логику вызова в методе, иначе он не будет выполнен.
2.2.1 loadUrl()
выполнить
tbsWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url, headerMap);
return true;
}
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
//安卓调用js方法。注意需要在 onPageFinished 回调里调用
tbsWebView.post(new Runnable() {
@Override
public void run() {
tbsWebView.loadUrl("javascript:callJsFunction('soloname')");
}
});
}
});
}
});
Если вам не нужно передавать параметры, просто удалите параметры.tbsWebView.loadUrl("javascript:callJsFunction()");
2.2.2 evaluateJavascript()
выполнить
в другом месте сloadUrl()
то же, только поставьtbsWebView.loadUrl("javascript:callJsFunction('soloname')");
заменять
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
//安卓调用js方法。注意需要在 onPageFinished 回调里调用
tbsWebView.post(new Runnable() {
@Override
public void run() {
tbsWebView.evaluateJavascript("javascript:callJsFunction('soloname')", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Logger.d("js返回的结果: " + s);
}
});
}
});
}
Вы можете видеть, что страница обновляется, и второй метод также получает возвращаемый результат.
3. JS вызывает нативные методы Android
JS может вызывать код Android тремя способами:
- пройти через
WebView
изaddJavascriptInterface()
делать сопоставление объектов - пройти через
WebViewClient
изshouldOverrideUrlLoading()
URL перехвата обратного вызова метода - пройти через
WebChromeClient
изonJsAlert()
,onJsConfirm()
,onJsPrompt()
Обратный вызов метода для перехвата диалога JSalert()
,confirm()
,prompt()
Информация
Сравнение: первый самый лаконичный, но есть лазейки под Android 4.2, второй и третий сложны в использовании, но проблемы с лазейками нет.
Поскольку текущая версия системы устройства в основном выше 4.2, можно использовать первую, простую и быструю. Время ограничено. В этой статье реализован только первый тип, а второй и третий типы не реализованы. Если вы хотите узнать больше, вы можете обратиться кэта статья.
3.1 Отображение эффектов
Достигаемый эффект заключается в том, чтобы нажать кнопку на странице H5, чтобы открыть собственный Android-файл.Toast
3.2 Vue-код
methods: {
showAndroidToast() {
$App.showToast("哈哈,我是js调用的")
}
}
существуетmethods
метод, определенный вshowAndroidToast()
, вызываемый при нажатии кнопки «Вызов Android Native Toast» на странице.
3.3 Код Android
новый классJsJavaBridge
public class JsJavaBridge {
private Activity activity;
private WebView webView;
public JsJavaBridge(Activity activity, WebView webView) {
this.activity = activity;
this.webView = webView;
}
@JavascriptInterface
public void onFinishActivity() {
activity.finish();
}
@JavascriptInterface
public void showToast(String msg) {
ToastUtils.show(msg);
}
}
затем пройтиWebView
настраиватьAndroid
Сопоставление классов с кодом JS
tbsWebView.addJavascriptInterface(new JsJavaBridge(this, tbsWebView), "$App");
класс здесьJsJavaBridge
Сопоставляется в JS как$App
, поэтому в Vue это можно назвать так$App.showToast("哈哈,我是js调用的")
.
Выше приведен взаимный вызов между Android и JS.