Android与H5交互

    xiaoxiao2023-03-28  6

    Android与H5交互 H5网页中调用安卓java代码、需要在webview控件中添加javascriptInterface contentWebView =(WebView) findViewById(R.id.webview);//启用javascript contentWebView.getSettings().setJavaScriptEnabled(true); contentWebView.addJavascriptInterface(this,"js对象名"); 在Activity中定义一个要被js调用的方法、src为js传递过来的参数、如果没有不传也可以的哈 publicvoid jsFunction(final String str){Toast.makeText(this, str,Toast.LENGTH_SHORT).show();  runOnUiThread(newRunnable(){@Overridepublicvoid run(){//在里对Android应用的UI进行处理}});} 在网页中、只需要像调用js方法一样、进行调用就可以 <a onClick="window.js对象名.jsFunction(´hello world´)">点击调用java代码并传递参数</a> 二、ANDROID中JAVA代码调用网页的JS代码的方法 Java代码调用js并传参其实是通过WebView的loadUrl方法去调用的、只是参数url的写法不一样而已 // 无参数调用 contentWebView.loadUrl("javascript:javacalljs()"); // 传递参数调用 contentWebView.loadUrl("javascript:javacalljswithargs("+"´hello world´"+")"); 三、JAVA和JS交互注意事项 1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法 、速度很快、50ms左右、所以尽量用js调用Java方法 2、Java 调用 js 的函数、没有返回值、调用了就控制不到了 3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native奶踢吾 的、转成 locale老K乐 的才能正常使用、使用 toLocale String() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间 4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验 交互的话,安卓这边只需要配置webview的jsBridge就可以了 一般接口什么的都是h5那边提供,这边这需要根据提供的接口进行实现就可以了 数据交互也是这样的,还有一种是写cookie      对于安卓开发有一段时间的人来说,知道安卓4.4以前谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户 端的重要信息,甚至轻而易举的调用本地代码进行流氓行为,谷歌后来发现有此漏洞后,增加了防御措施,如果要是js调用本地 代码,开发者必须在代码申明JavascriptInterface,   列如在4.0之前我们要使得webView加载js只需如下代码:   mWebView.addJavascriptInterface(new JsToJava(), "myjsfunction");       4.4之后调用需要在调用方法加入加入@JavascriptInterface注解,如果代码无此申明,那么也就无法使得js生效,也就是说这 样就可以避免恶意网页利用js对安卓客户端的窃取和攻击。         但是即使这样,我们很多时候需要在js记载本地代码的时候,要做一些判断和限制,或者有可能也会做些过滤和对用户友好 提示,因此JavascriptInterface也就无法满足我们的需求了,特此有大神就写出了WebViewJavascriptBridge框架。     通过实例化webView,用法和安卓原生的view没多大区别,设置WebChromClient, 设置加载的html(同样支持网络和本地文件) ,接着我们需要给web注册和html端约定好的js方法名。代码列举的submitFromweb和js的执行的方法名一致,玩过NDK的JNI调 用的朋友也知道必须和c代码之间有个约定,其实js桥和jni有点类似, 通过注册handler来实现回调,Java代码中通过js返回的数据,进行处理后在调用function.onCallback返回给js.这里不做过多解释 //必须和js同名函数,注册具体执行函数,类似java实现类 拦截URL Android中处理网页时我们必然用到WebView,这里我们有这样一个需求,我们想让WebView在处理网络请求的时候将某 些请求拦截替换成某些特殊的资源。具体一点儿说,在WebView加载 http://m.sogou.com 时,会加载一个logo图片, 我们的需求就是将这个logo图片换成另一张图片。 shouldInterceptRequest 好在Android中的WebView比较强大,从API 11(Android 3.0)开始, shouldInterceptRequest被引入就是为了解决这一类的 问题。 shouldInterceptRequest这个回调可以通知主程序WebView处理的资源(css,js,image等)请求,并允许主程序进行处理后 返回数据。如果主程序返回的数据为null,WebView会自行请求网络加载资源,否则使用主程序提供的数据。注意这个回 调发生在非UI线程中,所以进行UI系统相关的操作是不可以的。 shouldInterceptRequest有两种重载。
    转载请注明原文地址: https://ju.6miu.com/read-1209297.html
    最新回复(0)