android與javascript互動調用

來源:互聯網
上載者:User

我們都知道,手機時代的來臨的主要標誌是啥?能夠方便的接入互連網!互連網展現給我們的方式一般都是網頁,網頁中又必不可少的擁有javascript,所以說,android提供對javascript的支援那是迫在眉睫了,幸好,android早就給我們提供了無縫串連。讓我們可以通過android與javascript進行互動。

我們的應用很簡單,

我們有一個輸入框,旁邊有個按鈕,點擊按鈕就會提示我們輸入的內容。當然這隻是html中最簡單的程式了,但是你將這個程式放入android手機中訪問下試試,它是不會進行提示的。要想讓其以android的形式提示使用者,我們就需要用到android和javascript的互動。對了,這裡展示的是一個網頁哦,代碼如下:

js.html

<html><br /><head><br /><title>js互動android</title><br /><mce:script type="text/javascript"><!--</p><p>function show(){<br />var a = document.getElementById("text").value;<br />alert(a);</p><p>}<br />// --></mce:script><br /></head><br /><body><br /><form action=""><br /><input type="text" id="text" value=""/><br /><input type="button" id="button" onclick="window.chenzheng_java.show()" value="clickme"/></p><p></form></p><p></body><br /></html>

再看看我們的activity代碼:

package cn.com.chenzheng_java.js;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.os.Handler;<br />import android.util.Log;<br />import android.webkit.JsResult;<br />import android.webkit.WebChromeClient;<br />import android.webkit.WebSettings;<br />import android.webkit.WebView;<br />import android.widget.Toast;</p><p>public class JavaScriptActivity extends Activity {<br />WebView webView;<br />Handler handler = new Handler();</p><p>@Override<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.main);</p><p>webView = (WebView) findViewById(R.id.webView1);<br />/**<br /> * webSettings 儲存著WebView中的狀態資訊。當WebView第一次被建立時,webSetting中<br /> * 儲存的都為預設值。WebSetting和WebView是一一綁定的。如果webView被銷毀了,那麼<br /> * 我們再次調用webSetting中的方法時,會拋出異常。<br /> */<br />WebSettings webSettings = webView.getSettings();<br />webSettings.setJavaScriptEnabled(true);<br />webView.loadUrl("file:///data/js.html");</p><p>/***<br /> *webChromeClient是一個比較神奇的東西,其裡面提供了一系列的方法,<br /> *分別作用於我們的javascript代碼調用特定方法時執行,我們一般在其內部<br /> *將javascript形式的展示切換為android的形式。<br /> * 例如:我們重寫了onJsAlert方法,那麼當頁面中需要彈出alert視窗時,便<br /> * 會執行我們的代碼,按照我們的Toast的形式提示使用者。<br /> */<br />class MyWebChromeClient extends WebChromeClient {</p><p>@Override<br />public boolean onJsAlert(WebView view, String url, String message,<br />JsResult result) {<br />Toast.makeText(getApplicationContext(), message,<br />Toast.LENGTH_LONG).show();<br />return true;<br />}</p><p>}</p><p>webView.setWebChromeClient(new MyWebChromeClient());<br />/*<br /> * 為javascript提供一個回調的介面,這裡要注意,一定要在單獨的線程中實現,要不會阻塞線程的<br /> * addJavascriptInterface(Object obj, String interfaceName)<br /> * obj代表一個java對象,這裡我們一般會實現一個自己的類,類裡面提供我們要提供給javascript訪問的方法<br /> * interfaceName則是訪問我們在obj中聲明的方法時候所用到的js對象,調用模式為window.interfaceName.方法名()<br /> */<br />webView.addJavascriptInterface(new Object() {</p><p>public void show() {<br />handler.post(new Runnable() {<br />@Override<br />public void run() {<br />Log.i("通知", "調用了該方法哦");<br />/*<br /> * 通過webView.loadUrl("javascript:xxx")方式就可以調用當前網頁中的名稱<br /> * 為xxx的javascript方法<br /> */<br />webView.loadUrl("javascript:show()");<br />}<br />});</p><p>}</p><p>}, "chenzheng_java");</p><p>}<br />}

注意:

1)為了讓WebView從apk檔案中載入assets,Android SDK提供了一個schema,首碼為"file:///android_asset/"。WebView遇到這樣的schema,就去當前包中的assets目錄中找內容。如上面的"file:///android_asset/demo.html"

2)addJavascriptInterface方法中要綁定的Java對象及方法要運行另外的線程中,不能運行在構造他的線程中,這也是使用Handler的目的。

3)如果你要訪問網路,請在androidManifest.xml中加上許可權<uses-permission android:name="android.permission.INTERNET"></uses-permission>

---------------------------------------------------------------------------------------------------------

我們在程式中可以看到,android訪問網頁以及與javascript互動主要用到了這麼幾個類:

WebView :我們可以認為它就是一個瀏覽器,會對使用者訪問的網址進行解析,下載,渲染……,然後返回給使用者一個網頁。  其內部使用的是webkit渲染引擎,它還包含了一些我們經常使用的功能,比如放大、縮小網頁(需要在webSetting中先設定WebSettings.setBuiltInZoomControls(boolean));前進、後退……。

      預設情況下,webView對javascript和頁面的錯誤都是忽略的。很多時候,如果我們想要載入一個uri,可能我們更多的會使用這種形式:

Uri uri = Uri.parse("http://www.example.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);

api中為我們提供了一個通過webView載入頁面的例子,

我們可以看到,主要有loadUrl()和loadData()方法。這裡請注意各個參數的含義哦、

-------------------------------------------------------------

此外,android還為我們提供了一些類來輔助我們的webview的使用。

WebViewClient:

。WebViewClient就是協助WebView處理各種通知、請求事件的,具體來說包括:

 

  onLoadResource:通知webView載入url指定的資源時觸發

  onPageStart:頁面開始載入時觸發

  onPageFinish:頁面載入完畢時觸發

  onReceiveError:出現錯誤時觸發

  WebChromeClient:

WebChromeClient是輔助WebView處理Javascript的對話方塊,網站表徵圖,網站title,載入進度等

   onCloseWindow(關閉WebView)

  onCreateWindow()

  onJsAlert (WebView上alert是彈不出來東西的,需要定製你的WebChromeClient處理彈出)

  onJsPrompt

  onJsConfirm

  onProgressChanged

  onReceivedIcon

  onReceivedTitle

api中提供給我們一個執行個體:

WebSetting:和WebView是一一綁定的,控制webview的一些基礎設定資訊,如是否識別javascript,網頁是否可放大縮小等。

--------------------------------------------------------------------------

如果我們想通過webview進行曆史網頁查看時,一定要注意,先通過如下方法判斷下是否可執行該操作才好:

然後就可通過

void goBack()

Go back in the history of this WebView.
void goBackOrForward(int steps)

Go to the history item that is the number of steps away from the current item.
void goForward()

Go forward in the history of this WebView.

三個方法進行操作了,其中goBackOrForward傳遞進負數時為back操作,正數為forward操作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.