Android WebView上實現(xiàn)JavaScript與Java交互
其實webview加載資源的速度并不慢,但是如果資源多了,當(dāng)然就很慢。圖片、css 、js 、html這些資源每個大概需要10-200ms ,一般都是30ms就ok了。不過webview是必須等到全部資源都完成加載,才會進行渲染的,所以加載的速度很重要!從Google上我們了解到,webview加載頁面的順序是:先加載html,然后從里面解析出css、js文件和頁面上的圖片資源進行加載。如果webkit的緩存里面有,就不加載。加載完這些資源之后,就進行css的渲染和js的執(zhí)行。Css的渲染一般不需要很長時間,幾十毫秒就ok。關(guān)鍵是js的執(zhí)行,如果用了jQuery,則執(zhí)行起來需要5-6秒。而在這段時間,如果不在webview里設(shè)置背景,網(wǎng)頁部分是白色的,很難看。這是一個很糟糕的用戶體驗。所以#歐#柏泰#克建議如果用網(wǎng)頁布局程序,最好別用那些龐大的js框架。最好使用原生的js寫業(yè)務(wù)腳本,以提升加載速度,改善用戶體驗。
在混合開發(fā)中,有時會用到安卓原生SDK,如調(diào)用相機、查看相冊、錄音等,這就需要web頁面中的JavaScript能調(diào)用到安卓SDK接口。由于Android的WebView是基于webkit內(nèi)核的,集成了js與java互調(diào)的接口函數(shù),可以方便地進行開發(fā)使用。
界面布局xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <WebView android:id="@+id/webView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/linearLayout" /> <LinearLayout android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Java調(diào)用JavaScript接口" > </Button> </LinearLayout> </RelativeLayout>
java代碼:
private WebView webView; private Handler handler = new Handler(); private Button button; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.webView); //自定義webView設(shè)置 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJavaScriptInterface(MainActivity.this), "javaInterface"); //如果注釋了,javaScript中的alert彈窗等就會失效,不顯示 webView.setWebChromeClient(new WebChromeClient()); //webView.setWebChromeClient(new MyWebChromeClient()); //測試webView加載是否正常 //webView.loadUrl("http://www.baidu.com/"); webView.setWebViewClient(new HelloWebView()); webView.loadUrl("file:///android_asset/index.html"); button = (Button) findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String param = "bb"; webView.loadUrl("javascript:showTitle('"+param+"')"); } }); } private class HelloWebView extends WebViewClient{ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub view.loadUrl(url); return true; } } /** * 在主線程中定義JavaScript可以調(diào)用的安卓接口 * @author CHQ * API 以后,每個被調(diào)用java函數(shù)都要叫聲明 @JavascriptInterface */ public class MyJavaScriptInterface{ private Context context; public MyJavaScriptInterface(Context context){ this.context = context; } @JavascriptInterface public String toString() { return "this is interface"; } @JavascriptInterface public void clickOnAndroid() { Toast.makeText(context, "js調(diào)用安卓:....", Toast.LENGTH_SHORT).show(); } /** * 安卓調(diào)用JS接口,要開啟子線程調(diào)用 */ @JavascriptInterface public void call() { Toast.makeText(context, "安卓客戶端再調(diào)用JavaScript接口", Toast.LENGTH_SHORT).show(); handler.post(new Runnable() { @Override public void run() { String param = "bb"; webView.loadUrl("javascript:showTitle('"+param+"')"); } }); } }
其中:有幾點必須注意的,網(wǎng)上早期關(guān)于WebView的描述中,有幾點變化。1)安卓4.2以上的版本中使用WebView實現(xiàn)Java與Js互調(diào),java接口需要聲明@JavascriptInterface ; 2)WebView要調(diào)用setWebChromeClient(),以適應(yīng)Js等彈窗等實現(xiàn);3)addJavascriptInterface中綁定的接口中調(diào)用JavaScript接口,需要開啟子線程來調(diào)用(報錯:Caused by: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. );
HTML代碼:
<html> <script type="text/javascript"> //安卓定義的接口1 function callAndroidInterface() { window.javaInterface.clickOnAndroid(); } // function showTitle(param) { alert("傳參:"+param); var x = document.getElementById("title"); alert("標題:"+x.innerHTML); } </script> <body> <h3 id="title">關(guān)于安卓與JavaScript的交互</h3> <input type="button" value="調(diào)用接口1" onclick="callAndroidInterface()"></input> <input type="button" value="測試接口可用性" onclick="showTitle('aa')"></input> <input type="button" value="調(diào)用接口2" onclick="window.javaInterface.call()"></input> </body> </html>
以上html文件,其中javaInterface就是webView中addJavacriptInterface()方法中注入的接口入口名稱,通過該名稱就可以直接調(diào)用Java中的接口。(該html頁面需要保持到項目assets目錄中,由webView.loadUrl("file:///android_asset/index.html")來加載);
效果圖:
其中,對話框彈出:網(wǎng)址為"file://"的網(wǎng)頁顯示:,如果是服務(wù)器上的web頁面就會顯示源IP地址等等,顯然不是我們想要的。下一篇,我們可以重寫WebChromeClient來修改對話框、確認框等webView的優(yōu)化。
以上內(nèi)容是針對Android WebView上實現(xiàn)JavaScript與Java交互的全部內(nèi)容,希望對大家有所幫助!
相關(guān)文章
Android實現(xiàn)錄音方法(仿微信語音、麥克風(fēng)錄音、發(fā)送語音、解決5.0以上BUG)
大家平時在使用微信qq聊天時經(jīng)常會發(fā)送語音功能,今天小編給大家?guī)砹嘶赼ndroid實現(xiàn)錄音的方法仿微信語音、麥克風(fēng)錄音、發(fā)送語音、解決5.0以上BUG,需要的朋友參考下吧2018-04-04Android Studio中Run按鈕是灰色的快速解決方法
這篇文章主要介紹了Android Studio中Run按鈕是灰色的快速解決方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-03-03uniapp打包Android的apk(原生APP-云打包)及發(fā)布測試全過程
uni-app本地打包apk需要提前做非常多的準備工作,而且可能會勸退一些開發(fā)者,下面這篇文章主要給大家介紹了關(guān)于uniapp打包Android的apk(原生APP-云打包)及發(fā)布測試的相關(guān)資料,需要的朋友可以參考下2023-02-02Android菜單操作之創(chuàng)建并響應(yīng)菜單
這篇文章主要介紹了Android菜單操作之創(chuàng)建并響應(yīng)菜單的相關(guān)資料,如何使用代碼創(chuàng)建菜單項,給菜單項分組,及各種響應(yīng)菜單事件的方法,需要的朋友可以參考下2016-04-04使用Kotlin開發(fā)Android應(yīng)用教程
這篇文章主要為大家詳細介紹了使用Kotlin開發(fā)Android應(yīng)用的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05