Android WebView中的JavaScript和java代码的交互

来源:互联网 发布:程序员的思维修炼听书 编辑:程序博客网 时间:2024/06/10 06:29

绑定JavaScript与Android代码

  当你为你的Android应用中的WebView专门开发一个网页应用时,你可以创建你的JavaScript代码和你的客户端的Android代码之间的接口。

  比如,你可以用JavaScript代码调用Android代码中的方法,来展现一个对话框之类,而不是使用alert()方法(JS中的对话框方法)。

  在JS和Android代码间绑定一个新的接口,需要调用 addJavascriptInterface()方法。

  方法参数传入一个Java对象实例和一个字符串,该字符串是一个名字(interface name,注意此接口不是通常所说的那个用来实现的接口,而是传入的这个对象在JS中的别名),在JS代码中用此名字调用该Java对象的方法

  

  注意这个方法可以让JS代码控制宿主程序,这是一个非常有力的特性,但是同时也存在一些安全问题,因为进一步JS代码可以通过反射访问到注入对象的公有域。攻击者可能会在HTML和JavaScript中包含了有威胁性的代码。

  所以Android 4.1,API 17,也就是JELLY_BEAN 开始,只有被JavascriptInterface 注解标识的公有方法可以被JS代码访问。

  另外,因为JS代码和Java对象在这个WebView所私有的后台线程交互,所以还需要注意线程安全性问题。

  注意,与JS代码绑定的的这个Java对象运行在另一个线程中,与创建它的线程不是一个线程。

  注意,这个Java对象的域是不可访问的。

WebView webView = (WebView) findViewById(R.id.webview);webView.addJavascriptInterface(new WebAppInterface(this), "Android");

  给这个对象起的别名叫“Android”。

  这个就创立了一个接口名,叫“Android”,运行在WebView中的JS代码可以通过这个名字调用WebAppInterface类中的showToast()方法:

复制代码
<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /><script type="text/javascript">    function showAndroidToast(toast)     {        Android.showToast(toast);    }</script>
复制代码本人的代码部分:
public class MainActivity extends Activity {
WebView webView;
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.button);
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/www/js.html");
webView.addJavascriptInterface(this, "chenzheng_java");
webView.setWebChromeClient(new WebChromeClient());
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
webView.loadUrl("javascript:show('123456789')");
}
});
}
public void getData(String as){
Toast.makeText(getApplicationContext(), as, 1000).show();
}
}


<html>
<head>
<script>
            function show(a) {
                window.chenzheng_java.getData('我来了!!!!!' + a);
            }
</script>
</head>
<body>
<input type="text" id="text" value=""/>
<input type="button" id="button" onclick="show('haoge')" value="clickme"/>
</body>
</html>

0 0
原创粉丝点击