Java和JavaScript通信

来源:互联网 发布:书扬微信营销软件 编辑:程序博客网 时间:2024/05/20 16:35
原文地址:Java和JavaScript通信作者:androidrobot

Android设别具有很多强大的功能,如果可以用网页来展示实现,不是更好吗?

关键在于WebView类中的addJavaScriptInterface()方法,可以实现JavaScript调用Android程序中的方法,也可以实现Android调用JavaScript代码方法,需要做的就是用loadUrl()方法,将URL以javascript:function的形式传递给他。

具体例子如下:

/res/layout/main.xml

 

<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
   <WebView
   android:id="@+id/webView1"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:layout_weight="1.0">
   </WebView>
   <LinearLayout
   android:layout_width="fill_parent"
   android:id="@+id/linearLayout1"
   android:layout_height="fill_parent"
   android:layout_weight="1.0"
   android:orientation="vertical"
   android:padding="5sp">
       <TextView
       android:text="TextView"
       android:id="@+id/textView1"
       android:textSize="24sp"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content">
       </TextView>
       <Button
       android:text="Call JavaScript From Android"
       android:id="@+id/button1"
       android:textSize="18sp"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content">
       </Button>
       <TextView
       android:text=""
       android:id="@+id/textView2"
       android:textSize="18sp"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content">
       </TextView>
   </LinearLayout>
</LinearLayout>

//要展现的页面,内嵌套JS

/assets/index.html

 

<?xml version="1.0"encoding="utf-8"?>
<html>
 <head>
  <scriptlanguage="javascript">
  function callJS(arg){
   document.getElementByIdx_x_x('replaceme').innerHTML=arg;
  }
  </script>
 </head>
 <body>
  <h1>WebView</h1>
  <p>
  <a href="#"onclick="window.alert('Alert FromJavascript')">
  Display JavaScript alert
  </a>
  </p>
  <p>
  <!--鏅�氭祻瑙堝櫒鏄棤娉曡皟鐢ㄨ繖涓柟娉曠殑锛屾墍浠ュ簲璇ラ噸瀹氫箟杩欎釜瀵硅薄 -->
  <a href="#"onclick="window.android.callAndroid('Hello fromBrowser')">
  Call Android fromJavaScript
  </a>
  </p>
  <pid="replaceme"></p>
 </body>
</html>
//源代码

/src/LocalBrowserActivity.java

 

package com.liwei;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.JsResult;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class LocalBrowserActivity extends Activity {
   
 private static final StringTAG="LocalBrowser";
 //JavaScript调用进入专用于浏览器的线程,但是Android用户界面只能通过住UI线程实现
  //因此,Handler类进行转换
 private final Handler handler = newHandler();
 private WebView  webView;
 private TextView textView;
 private Button  button;
 
   @Override
    public voidonCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       
       webView = (WebView)this.findViewById(R.id.webView1);
       textView = (TextView)this.findViewById(R.id.textView2);
       button =(Button)this.findViewById(R.id.button1);
       webView.getSettings().setJavaScriptEnabled(true);
       webView.addJavascriptInterface(new AndroidBridge(),"android");
       
       webView.setWebChromeClient(new WebChromeClient(){
        public boolean onJsAlert(final WebView view,finalString url,
          final Stringmessage,JsResult ss){
         Toast.makeText(LocalBrowserActivity.this,message, 3000).show();
         ss.confirm();
         return true;
        }
       });
       //对于Android浏览器来说,file:///android_assets/文件名形式的UrL具有特殊的意义。
       //注意有三个(///)
       webView.loadUrl("file:///android_asset/index.html");
       
       button.setOnClickListener(new OnClickListener() {
   
   public voidonClick(View v) {
    //TODO Auto-generated method stub
    //调用定义在index.xml文件中的callJS()函数
    webView.loadUrl("javascript:callJS('hellofrom android')");
   }
  });
    }
    classAndroidBridge{
    public void callAndroid(finalString  arg){
     handler.post(new Runnable(){
    
    publicvoid run() {
     //TODO Auto-generated method stub
     Log.d(TAG,"callAndroid("+arg+")");
     textView.setText(arg);
    }
   });
    }
    }
}

 

运行最终效果:

[转载]Java和JavaScript通信

总结一下:

JavaScript调用callAndroid()方法时,应用程序会穿件新的Runnable对象,并使用Handler.post()将对象烦烦到主线程的运行队列中。

首先打开Javascript,并注册到JavaScript桥接:

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavaScriptInterface(newAndroidBrige(),"android");

还有一点就是完成WebView的配置,使用loadUrl()来加载本地网页:

webView.loadUrl("file:///android_asset/index.html");
最后就是进行JavaScript调用(从Java到JavaScript的调用):

webView.loadUrl("javascript:callJS('hello fromandroid')");

 

 

到此就讲解完了。

0 0