Android WebView JS 与 Java Native 相互调用示例

直接上代码,有注释,学习Android过程记录。

Android Activity代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
,并暴露对象名为ntv,js使用window.ntv.functionName()方式调用
wv.addJavascriptInterface(new JsCall(), "ntv");

ws = wv.getSettings();
ws.setJavaScriptEnabled(true);

//不使用缓存
ws.setCacheMode(WebSettings.LOAD_NO_CACHE);
//支持缩放
ws.setSupportZoom(true);
//自适应屏幕
ws.setUseWideViewPort(true);
ws.setLoadWithOverviewMode(true);
}

//js调用的类及方法
class JsCall {
@JavascriptInterface
public String tost(String msg) {
Toast.makeText(activity, "toast: " + msg, Toast.LENGTH_SHORT).show();
return "JsCalled Native: " + msg;
}
}

//回退栈(WebView页面)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (wv.canGoBack()) {
wv.goBack();//返回上一浏览页面
return true;
} else {
finish();//关闭Activity
}
}
return super.onKeyDown(keyCode, event);
}

//ActionBar菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}

//ActionBar菜单响应
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item:
Toast.makeText(this, "Menu Item", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}

布局文件LinearLayout布局,orentation=vertical,一个EditText,一个Button一个WebView,长什么样子的话想象一下就好了。

html文件,同样非常简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html>
<head>
<title>DEMO TEST</title>
<script type="text/javascript">
function fill(val)
{
var txt=document.getElementById('txtinput');
txt.value=val;
alert(val);
}
function native()
{
var txt=document.getElementById('txtinput');
alert(window.ntv.tost(txt.value));
}
</script>

<style type="text/css">

body{
font-size: 20px;
}
</style>
</head>
<body>
<input type="text" id="txtinput" /><br />
<button onclick="native()">CALL JAVA NATIVE</button>
</body>

参考资料:developer.android.com WebView

源码下载:WebViewNJs