您的位置:首页 > 移动开发 > Android开发

Android 里js 与java相互调用

2009-12-08 11:16 435 查看
在android里将一个java对象添加成一个js对象只需要调用WebView::addJavascriptInterface()方法;

下面用一个小例子来说明:
Java代码

1.
public class WebViewDemo extends Activity {
2.

3.
private static final String LOG_TAG = "WebViewDemo";
4.

5.
private WebView mWebView;
6.

7.
private Handler mHandler = new Handler();
8.

9.
@Override
10.
public void onCreate(Bundle icicle) {
11.
super.onCreate(icicle);
12.
setContentView(R.layout.main);
13.
mWebView = (WebView) findViewById(R.id.webview);
14.

15.
WebSettings webSettings = mWebView.getSettings();
16.
webSettings.setSavePassword(false);
17.
webSettings.setSaveFormData(false);
18.
webSettings.setJavaScriptEnabled(true);
19.
webSettings.setSupportZoom(false);
20.

21.
mWebView.setWebChromeClient(new MyWebChromeClient());
22.

23.
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
24.

25.
mWebView.loadUrl("file:///android_asset/demo.html");
26.
}
27.

28.
final class DemoJavaScriptInterface {
29.

30.
DemoJavaScriptInterface() {
31.
}
32.

33.
/**
34.
* This is not called on the UI thread. Post a runnable to invoke
35.
* loadUrl on the UI thread.
36.
*/
37.
public void clickOnAndroid() {
38.
mHandler.post(new Runnable() {
39.
public void run() {
40.
mWebView.loadUrl("javascript:wave()");
41.
}
42.
});
43.

44.
}
45.
}
46.

47.
/**
48.
* Provides a hook for calling "alert" from javascript. Useful for
49.
* debugging your javascript.
50.
*/
51.
final class MyWebChromeClient extends WebChromeClient {
52.
@Override
53.
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
54.
Log.d(LOG_TAG, message);
55.
result.confirm();
56.
return true;
57.
}
58.

59.
}
60.
}

Html代码

1.
<html>
2.
<script language="javascript">
3.
/* This function is invoked by the activity */
4.
function wave() {
5.
alert("1");
6.
document.getElementById("droid").src="android_waving.png";
7.
alert("2");
8.
}
9.
</script>
10.
<body>
11.
<!-- Calls into the javascript interface for the activity -->
12.
<a onClick="window.demo.clickOnAndroid()"><div style="width:80px;
13.
margin:0px auto;
14.
padding:10px;
15.
text-align:center;
16.
border:2px solid #202020;" >
17.
<img id="droid" src="android_normal.png"/><br>
18.
Click me!
19.
</div></a>
20.
</body>
21.
</html>

addJavascriptInterface
在android里的实现:
static void
AddJavascriptInterface(JNIEnv *env, jobject obj, jint
nativeFramePointer,
jobject
javascriptObj, jstring interfaceName)
{
#ifdef
ANDROID_INSTRUMENT

TimeCounterAuto
counter(TimeCounter::NativeCallbackTimeCounter);
#endif

WebCore::Frame* pFrame =
(WebCore::Frame*)nativeFramePointer;

LOG_ASSERT(pFrame, "nativeAddJavascriptInterface must take a valid frame
pointer!");

JavaVM*
vm;

env->GetJavaVM(&vm);

LOGV("::WebCore:: addJSInterface: %p",
pFrame);

// Copied
from qwebframe.cpp
JSC::JSLock
lock(false);

WebCore::JSDOMWindow *window =
WebCore::toJSDOMWindow(pFrame);

JSC::Bindings::RootObject *root =
pFrame->script()->bindingRootObject();
if (window)
{

JSC::Bindings::setJavaVM(vm);
// Add
the binding to JS environment

JSC::ExecState* exec =
window->globalExec();

JSC::JSObject *addedObject =
WeakJavaInstance::create(javascriptObj,

root)->createRuntimeObject(exec);
const
jchar* s = env->GetStringChars(interfaceName,
NULL);
if (s)
{
//
Add the binding name to the window's table of child
objects.

JSC::PutPropertySlot slot;

window->put(exec, JSC::Identifier(exec, (const UChar *)s,

env->GetStringLength(interfaceName)), addedObject,
slot);

env->ReleaseStringChars(interfaceName,
s);

checkException(env);

}

}
}

在这里细心的朋友已看到这里的js与java相互调用都是不带参数的,那它可以带参数吗?可以带哪些类型的参数,有什么规范?这些将在下回分析!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: