博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android ---- WebView与JavaScript交互调用(1)
阅读量:2261 次
发布时间:2019-05-09

本文共 3669 字,大约阅读时间需要 12 分钟。

现在很多的手机应用,都可能会直接嵌入一个web页面。这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端;另一个是功能通用,不仅android可以用,ios也可以用,symbian也可以直接用。而且WebView对Javascript的支持很强,但也没有亲身编程测试一下,所有这里举个例子说明一下如何在Javascript中调用java中函数

1、创建一个android 工程 TestWebView

2、继承自 Activity

public class TestWebView extends Activity {	private WebView mWebView;	@Override	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.main);		mWebView = (WebView) findViewById(R.id.htmlview);		WebSettings webSettings = mWebView.getSettings();				// 是否允许在webview中执行javascript		webSettings.setJavaScriptEnabled(true);		// 绑定java对象到JavaScript中,这样就能在JavaScript中调用java对象,实现通信。		// 这种方法第一个参数就是java对象,第二个参数表示java对象的别名,在JavaScript中使用		 mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");		 // webview加载本地html代码,注意本地html代码必须放在工程assets目录下,然后通过		// file:///android_asset/demo.html访问		mWebView.loadUrl("file:///android_asset/demo.html");	}		public class DemoJavaScriptInterface {		public DemoJavaScriptInterface() {		}		public int mydata() {			Log.i("TEST","mydata.....");			return 0;		}	}} 3、修改 main.xml 文件如下 
4、在assets目录下,新建一个html文件:demo.html,使用JAVAScript代码编写
Insert title here this is web html
test
注意上面  οnclick="document.getElementById('output').innerHTML=window.demo.mydata()" 直接调用 window.demo.mydata() 的方法 ok, 轻松就将代码写完,现在补充说明一下用到的知识点: 先看SDK API函数介绍: public void addJavascriptInterface ( obj,  interfaceName)
Use this function to bind an object to JavaScript so that the methods can be accessed from JavaScript.
IMPORTANT:
Using addJavascriptInterface() allows JavaScript to control your application. This can be a very useful feature or a dangerous security issue. When the HTML in the WebView is untrustworthy (for example, part or all of the HTML is provided by some person or process), then an attacker could inject HTML that will execute your code and possibly any code of the attacker's choosing. Do not use addJavascriptInterface() unless all of the HTML in this WebView was written by you.
The Java object that is bound runs in another thread and not in the thread that it was constructed in.
Parameters
obj
The class instance to bind to JavaScript, null instances are ignored.
interfaceName
The name to used to expose the instance in JavaScript.
通过addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。 再补充下在开发过程中应该注意几点: 1、AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误 2、如果访问的页面中有Javascript,则webview必须设置支持Javascript。 webview.getSettings().setJavaScriptEnabled(true); 3、如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebViewClient对象。 mWebView.setWebViewClient(new WebViewClient(){
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); 4、如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode, event); } 5、addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。如此上面的代码则可以修改成如下即可,利用Handler发送消息进行处理: public int mydata() { mHandler.post(new Runnable() { public void run() { Log.i("TEST", "mydata....."); } }); return 0; }

转载地址:http://uedcb.baihongyu.com/

你可能感兴趣的文章
DroidDraw教程
查看>>
Dollars_Euros
查看>>
Android fill_parent、wrap_content和match_parent的区别
查看>>
android TabHost小结
查看>>
Android@id和@+id区别?
查看>>
Android开发:Handler Runnable和Thread之间的区别和联系 应用
查看>>
Android开发:canvas.drawTextOnPath()无效
查看>>
Android上掌纹识别第一步:基于OpenCV的6种肤色分割 源码和效果图
查看>>
能不能用system.out.print();代替e.printStackTrace();呢?
查看>>
在内部类中可以访问其外部类的所有域,即使是私有域
查看>>
ReflectUtil
查看>>
如何用adb命令启动你的Android程序
查看>>
哪位高手能给个Java的IO流类的层次结构呵~
查看>>
UART通信
查看>>
Ubuntu下挂载U盘
查看>>
15.2.2.4 传递整型数组
查看>>
回馈制动在变频器中的应用
查看>>
Hitech 公司完全免费的学习版 PICC-Lite 编译器套件
查看>>
Android风格与主题
查看>>
android screenOrientation属性
查看>>