设为首页 加入收藏

TOP

Android WebView使用深入浅出(三)
2015-07-16 12:55:45 来源: 作者: 【 】 浏览:21
Tags:Android WebView 使用 深入浅出
essage msg = new Message();
? ? msg.obj = cookie;
? ? if(mHandler != null){
? ? ? ? mHandler.sendMessage(msg);
? ? ? ? return;
? ? }
}


随后在主线程中(webview加载登陆界面前),在handler中将会获取到cookie信息,下面将对该cookie进行保存和同步:


? ? private Handler mHandler = new Handler(){
? ? ? ? public void handleMessage(android.os.Message msg)
? ? ? ? {
? ? ? ? ? ?
? ? ? ? ? ? CookieSyncManager.createInstance(MainActivity.this);
? ? ? ? ? ? CookieManager cookieMgr = CookieManager.getInstance();
? ? ? ? ? ? cookieMgr.setAcceptCookie(true);
? ? ? ? ? ? cookieMgr.setCookie("", msg.obj.toString());// this place should add the login host address(not the login index address)
? ? ? ? ? ? CookieSyncManager.getInstance().sync();
? ? ? ? ? ?
? ? ? ? ? ? webview.loadUrl("");// login index address
? ? ? ? };
? ? };


这个时候发现webview加载的login index页面中可以自动的登陆了并显示登陆后的界面。


五、 WebView与java script的交互


1. webview调用js


mWebView.loadUrl("java script:do()");


以上是webview在调用js中的一个叫做do的方法,该js所在的html文件大致如下:



? ? <script language="java script">
? ? ? ? /* This function is invoked by the webview*/
? ? ? ? function do() {
? ? ? ? ? ? alert("1");
? ? ? ? }
? ?
? ?
? ? ? ?


? ?



2. js调用webview


我们假设下列的本地类是要给js调用的:


package com.test.webview;
class Demojava scriptInterface {


? ? ? ? Demojava scriptInterface() {
? ? ? ? }


? ? ? ? /**
? ? ? ? * This is not called on the UI thread. Post a runnable to invoke
? ? ? ? * loadUrl on the UI thread.
? ? ? ? */
? ? ? ? public void clickOnAndroid() {
? ? ? ? ? ? mHandler.post(new Runnable() {
? ? ? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? ? ? //TODO
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });


? ? ? ? }
? ? }


首先给webview设置:


mWebview.setjava scriptEnabled(true);


随后将本地的类(被js调用的)映射出去:


mWebView.addjava scriptInterface(new Demojava scriptInterface(), "demo");


“demo”这个名字就是公布出去给JS调用的,那么js久可以直接用下列代码调用本地的Demojava scriptInterface类中的方法了:


?
? ? ...


六、WebView与java script相互调用混淆问题


若webview中的js调用了本地的方法,正常情况下发布的debug包js调用的时候是没有问题的,但是通常发布商业版本的apk都是要经过混淆的步骤,这个时候会发现之前调用正常的js却无法正常调用本地方法了。


这是因为混淆的时候已经把本地的代码的引用给打乱了,导致js中的代码找不到本地的方法的地址。


解决这个问题很简单,即在proguard.cfg文件中加上一些代码,声明本地中被js调用的代码不被混淆。下面举例说明:


第五节中被js调用的那个类Demojava scriptInterface的包名为com.test.webview,那么就要在proguard.cfg文件中加入:


-keep public class com.test.webview.Demojava scriptInterface{
? ? public ;
}


若是内部类,则大致写成如下形式:


-keep public class com.test.webview.Demojava scriptInterface$InnerClass{
? ? public ;
}


若android版本比较新,可能还需要添加上下列代码:


-keepattributes *Annotation*?
-keepattributes *java scriptInterface*


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇EventBus框架在Android多Pane(Fra.. 下一篇Ruby 2.2 的增量垃圾收集机制

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: