Java和JavaScript通信

原文地址: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>
  <script language="javascript">
  function callJS(arg){
   document.getElementByIdx_x_x('replaceme').innerHTML=arg;
  }
  </script>
 </head>
 <body>
  <h1>WebView</h1>
  <p>
  <a href="#" οnclick="window.alert('Alert From Javascript')">
  Display JavaScript alert
  </a>
  </p>
  <p>
  <!-- 鏅�氭祻瑙堝櫒鏄棤娉曡皟鐢ㄨ繖涓柟娉曠殑锛屾墍浠ュ簲璇ラ噸瀹氫箟杩欎釜瀵硅薄 -->
  <a href="#" οnclick="window.android.callAndroid('Hello from Browser')">
  Call Android from JavaScript
  </a>
  </p>
  <p id="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 String TAG="LocalBrowser";
 //JavaScript调用进入专用于浏览器的线程,但是Android用户界面只能通过住UI线程实现
  //因此,Handler类进行转换
 private final Handler handler = new Handler();
 private WebView  webView;
 private TextView  textView;
 private Button  button;
 
    @Override
    public void onCreate(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,final String url,
           final String message,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 void onClick(View v) {
    // TODO Auto-generated method stub
    //调用定义在index.xml文件中的callJS()函数
    webView.loadUrl("javascript:callJS('hello from android')");
   }
  });
    }
    class AndroidBridge{
     public void callAndroid(final String  arg){
      handler.post(new Runnable() {
    
    public void 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(new AndroidBrige(),"android");

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

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

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

 

 

到此就讲解完了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值