我們都知道,手機時代的來臨的主要標誌是啥?能夠方便的接入互連網!互連網展現給我們的方式一般都是網頁,網頁中又必不可少的擁有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操作。