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相互调用都是不带参数的,那它可以带参数吗?可以带哪些类型的参数,有什么规范?这些将在下回分析!
下面用一个小例子来说明:
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相互调用都是不带参数的,那它可以带参数吗?可以带哪些类型的参数,有什么规范?这些将在下回分析!
相关文章推荐
- Android中webview里js和java的相互调用--含代码demo解析
- Android ---js与java的相互调用
- 2011/06/13 android使用html做UI的方法---js与java的相互调用
- Android ---js与java的相互调用
- android WebView java与js相互调用
- Android的WebView中js与java代码相互调用
- Android ---js与java的相互调用
- android中webviewjs与java的相互调用
- Android 使用html做UI的方法---js与java的相互调用
- 2011/06/13 android使用html做UI的方法---js与java的相互调用
- android中webviewjs与java的相互调用
- Android ---js与java的相互调用
- Android基于WebView的Java和JS相互调用实现步骤,附带精简可行的DEMO
- Android的WebView中js与java代码相互调用
- Android之Webview使用Java代码和JS相互调用
- Android ---js与java的相互调用
- 2011/06/13 android使用html做UI的方法---js与java的相互调用
- android2.3上用WebView组件js和java相互调用报错
- Android开发学习之路--Java和Js互相调用
- Android WebView与网页JS相互调用