安卓有很多xxxView组件,
和web开发接除的最多的是webView
我们混合开发的时候基本都会用到这个组件

基本使用

修改布局文件

布局文件使用WebView标签,代码修改如下

activity_main.xml
<WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

修改入口函数

找到入口函数文件

kotlin
java
MainActivity.kt
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 创建webView
        val webView: WebView =findViewById(R.id.webView);
        webView.loadUrl("https://www.baidu.com/");//加载url
        webView.webViewClient = WebViewClient() // 防止调用外部浏览器
        webView.webChromeClient = WebChromeClient() // alert弹窗需要
        webView.settings.javaScriptCanOpenWindowsAutomatically = true //设置js可以直接打开窗口,如window.open(),默认为false
        webView.settings.javaScriptEnabled = true //是否允许执行js,默认为false。设置true时,会提醒可能造成XSS漏洞
        webView.settings.setSupportZoom(false) //是否可以缩放,默认true
        webView.settings.builtInZoomControls = true //是否显示缩放按钮,默认false
        webView.settings.useWideViewPort = true //设置此属性,可任意比例缩放。大视图模式
        webView.settings.loadWithOverviewMode = true //和setUseWideViewPort(true)一起解决网页自适应问题
        webView.settings.domStorageEnabled = true //DOM Storage
        webView.settings.allowFileAccessFromFileURLs = true // 处理跨域问题(主要是vue、react打包后白屏问题)
        webView.settings.javaScriptEnabled = true
        // webView.settings.setAppCacheEnabled(true) //是否使用缓存==Android13废弃
        
    }

添加网络访问权限

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dshvv.myapplication">
    <uses-permission android:name="android.permission.INTERNET" /><!-- 增加这一行: 允许app访问网络-->
  <application
        android:usesCleartextTraffic="true" <!-- 增加这一行: 允许明文请求,即http-->
  ...

最后重新编译,运行,就可以啦

访问本地页面

Android studio中右键项目根目录>New>Folder>Assets Folder 然后将网页写在这里就可以。

最后

webView.loadUrl("file:///android_asset/index.html");//加载url

记得 最好要处理webView对象一定要配置允许跨域,否则可能白屏。

web(js)访问andriod方法

向前端window中注入全局变量

kotlin
java
MainActivity.kt
webView.addJavascriptInterface(WebAppInterface(this), "demoApp");

创建与web通讯的自定义类

kotlin
java
WebAppInterface.kt
/**
 * 向浏览器window中注入的全局变量类(前端接收到的是个对象)
 */
class WebAppInterface(app: AppCompatActivity) {
    private val app = app;
    /**
     *对象中的成员
     */
    @JavascriptInterface
    public fun method(arg: Any?){
        Toast.makeText(app.applicationContext, "默认的Toast", Toast.LENGTH_SHORT).show();
    }
}

前端调用

<script>
        demoApp.method('你好,世界')
</script>

andriod访问web(js)方法

安卓页面中定一个按钮,及其按钮事件

<Button
        android:id="@+id/button"
        android:onClick="btnClick"
        android:layout_width="200dp"
        android:text="我是安卓原生按钮"
        android:layout_height="50dp"/>
kotlin
java
fun btnClick(view: View?) {
    webView.post(Runnable { // 调用js方法
        webView.evaluateJavascript("test('你好,世界')", null)
        // webView.loadUrl("test('你好,世界')"); // 旧版

        // 如果要给js传递对象(数组),则需要使用序列化 这里推荐gson库 https://github.com/google/gson
        val list: List<*> = ArrayList<Any?>()
        webView.evaluateJavascript("test" + "(" + gson.toJson(list) + ")", null)
    })
}

web前端定义此方法

 <script>
        const test = (params)=>{
            alert(params)
        }
</script>

web前端和原生前端的交互

总的来说比较方便,cordova等jsBirdge方式,也能够让两种开发者更好的沟通。

chrome调试webview

放开调试

首先安卓代码的onCreate要增加如下代码,放开调试

WebView.setWebContentsDebuggingEnabled(true);

前端访问

浏览器输入 chrome://inspect/#devices

参考:https://blog.csdn.net/carson_ho/article/details/64904691/