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通信 [转载]Java和JavaScript通信](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
总结一下:
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')");
到此就讲解完了。