JavaScript與Java通訊,javascriptjava
1、WebView中JavaScript調用Android程式中Java:
使用WebView類中的addJavascriptInterface()方法,可以使用它擴充嵌入式瀏覽器內的DOM(文件物件模型),並定義JavaScript代碼可以訪問的新對象。JavaScript代碼調用該對象的方法時,實際上它會調用Android程式中的方法。
2、在Android程式中調用JavaScript方法:
調用loadUrl()方法,將URL以javascript:要執行的代碼 的形式傳遞給它。瀏覽器會在當前頁面執行給定的JavaScript運算式,而不是轉到新的頁面。
執行個體:
構建一個Android程式,布局如下(res/layout/activity_local_browser.xml)
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <WebView android:id="@+id/web_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:orientation="vertical" > <TextView android:id="@+id/url_field" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/textview"/> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/call_javascript_from_android" /> <TextView android:id="@+id/text_view" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout></LinearLayout>
可以看出,布局的上半部分是WeView控制項,下部分是來自Android使用者介面的TextView和Button。
下面需要完成將被載入到WebView中的index.html檔案(assets/index.html),代碼如下
<html><head><script language="JavaScript">function callJS(arg){document.getElementById('replaceme').innerHTML = arg;}</script></head><body><h1>WebView</h1><p><a href="#" onclick="window.alert('Alert from JavaScript')">Display JavaScript alert</a></p><p><a href="#" onclick="window.android.callAndroid('Hello from Browser')">Call Android from JavaScript</a></p><p id="replaceme"></p></body></html>
可以看到,callJS()函數是將會在Java代碼中被調用JavaScript函數,它接收一個參數並賦值給replaceme標籤。往下的兩條連結分別是調用window.alert()函數(顯示短訊息)和window.android對象的callAndroid()方法(在Java代碼中定義好的)。
同時不要忘記在res/values/strings.xml檔案中完成字串的賦值:
<?xml version="1.0" encoding="utf-8"?><resources> <string name="app_name">LocalBrower</string> <string name="action_settings">Settings</string> <string name="textview">TextView</string> <string name="call_javascript_from_android">Call JavaScript from Android</string></resources>
完成這些準備後,就可以把目光放在程式的LocalBrowser類上了,代碼如下:
package com.example.localbrowser;import android.support.v7.app.ActionBarActivity;import android.annotation.SuppressLint;import android.os.Bundle;import android.os.Handler;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.webkit.JavascriptInterface;import android.webkit.JsResult;import android.webkit.WebView;import android.webkit.WebChromeClient;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;@SuppressLint("JavascriptInterface")public class LocalBrowser extends ActionBarActivity {private WebView webview;private Button button;private TextView textview;private final Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_local_browser);webview = (WebView) findViewById(R.id.web_view);button = (Button) findViewById(R.id.button);textview = (TextView) findViewById(R.id.text_view);button.setOnClickListener(new OnClickListener() {public void onClick(View view) {//單擊按鈕時,通過WebView.loadUrl()方法調用index.html中定義的callJS()函數webview.loadUrl("javascript:callJS('Hello from Android')");}});//開啟JavaScript(預設是關閉的)webview.getSettings().setJavaScriptEnabled(true);//往WebView中注入Java對象,從而使得在index.tml中能使用此對象的方法webview.addJavascriptInterface(new AndroidBridge(), "android");webview.setWebChromeClient(new WebChromeClient() {// 覆蓋預設的window.alert()的展示介面public boolean onJsAlert(final WebView view, final String url,final String message, JsResult result) {Toast.makeText(LocalBrowser.this, message, 3000).show();result.confirm();return true;}});webview.loadUrl("file:///android_asset/index.html");//載入本地網頁,注意有3個斜杠}public class AndroidBridge {@JavascriptInterface// 要通過JavaScript調用的Java程式碼片段public void callAndroid(final String arg) {handler.post(new Runnable() {public void run() {textview.setText(arg);}});}}}
整個過程很簡單,但有點要注意的是:
在AdroidBridge類中
4.2之前向WebView注入的對象所暴露的介面callAndroid沒有備註陳述式@JavascriptInterface,而4.2及以後的則多了備註陳述式@JavascriptInterface。如果去掉這行代碼,當程式調用此方法時,將不能成功,而logcat會報如下輸出:
E/Web Console: Uncaught TypeError: Object [object Object] has no method 'callAndroid'
程式介面:
當單擊按鈕和連結時,它會在兩個環境間進行調用,下面是運行
java與javascript的不同
雖然JavaScript與Java有緊密的聯絡,但卻是兩個公司開發的不同的兩個產品。Java是SUN公司推出的新一代物件導向的程式設計語言,特別適合於Internet應用程式開發;而JavaScript是Netscape公司的產品,其目的是為了擴充Netscape Navigator功能,而開發的一種可以嵌入Web頁面中的基於對象和事件驅動的解釋性語言, 它的前身是Live Script;而Java的前身是Oak語言。下面對兩種語言間的異同作如下比較:
基於對象和物件導向
Java是一種真正的物件導向的語言,即使是開發簡單的程式,必須設計對象。
JavaScript是種指令碼語言,它可以用來製作與網路無關的,與使用者互動作用的複雜軟體。它是一種基於對象(Object Based)和事件驅動(Event Driver)的程式設計語言。因而它本身提供了非常豐富的內部對象供設計人員使用。
解釋和編譯
兩種語言在其瀏覽器中所執行的方式不一樣。Java的原始碼在傳遞到用戶端執行之前,必須經過編譯,因而用戶端上必須具有相應平台上的模擬器或解譯器,它可以通過編譯器或解譯器實現獨立於某個特定的平台編譯代碼的束縛。
JavaScript是一種解釋性程式設計語言,其原始碼在發往用戶端執行之前不需經過編譯,而是將文字格式設定的字元代碼發送給客戶編由瀏覽器解釋執行。
強變數和弱變數
兩種語言所採取的變數是不一樣的。
Java採用強型別變數檢查,即所有變數在編譯之前必須作聲明。如:
Integer x;
String y;
x=1234;
x=4321;
其中X=1234說明是一個整數,Y=4321說明是一個字串。
JavaScript中變數聲明,採用其弱類型。即變數在使用前不需作聲明,而是解譯器在運行時檢查其資料類型,如:
x=1234;
y="4321";
前者說明x為其數值型變數,而後者說明y為字元型變數。
代碼格式不一樣
Java是一種與HTML無關的格式,必須通過像HTML中引用外媒體那麼進行裝載,其代碼以位元組代碼的形式儲存在獨立的文檔中。
JavaScript的代碼是一種文本字元格式設定,可以直接嵌入HTML文檔中,並且可動態裝載。編寫HTML文檔就像編輯文字檔一樣方便。
嵌入方式不一樣
在HTML文檔中,兩種程式設計語言的標識不同,JavaScript使用<Script>...</Script>來標識,而Java使用<applet>...</applet>來標識。
靜態聯編和動態聯編
Java採用靜態聯編,即Java的對象引用必須在編譯時間的進行,以使編譯器能夠實現強型別檢查。
JavaScript採用動態聯編,即JavaScript的對象引用在運行時進行檢查,如不經編譯則就無法實現對象引用的檢查。
JavaScript與Java的不同?
JavaScript 是一種嵌入式指令檔,直接插入網頁,有瀏覽器一邊解釋一邊執行。
java 語言不一樣,他必須在JAVA虛擬機器上運行。而且事先需要進行編譯。
JAVA的文法規則比JavaScript要嚴格的多,功能要強大的多。