cordova wkwebviewwebview 的addjavascriptinterface方法用什么替代

5917人阅读
adroid开发(6)
博客分类:
Cordova应用基于Webview,所以后台代码和js交互都是基于Webview(Webkit)的接口的。
@JavascriptInterface/WebView#addJavascriptInterface()
UIWebViewDelegate/UIWebView#stringByEvaluatingJavaScriptFromString()
以下以Android调用照相机为例,简单说明一下调用及回调过程。
(1)创建的过程
①添加插件
cordova plugin add org.apache.cordova.camera
在plugins的目录下创建org.apache.cordova.camera文件夹,并将该Plugin的所有代码Copy进去,具体代码依赖关系都记录在plugin.xml里。
②创建Android工程
cordova platform add android
从上边的Plugin文件夹中把Java文件和js文件Copy到Android工程的相应的文件夹下。
platforms\android\src\org\apache\cordova\camera\CameraLauncher.java等platforms\android\assets\www\plugins\org.apache.cordova.camera\www\Camera.js等
其中CameraLauncher扩展自CordovaPlugin,而CordovaPlugin定义在platforms\android\CordovaLib中,它是Cordova的基础框架代码。
(2)调用的过程(JS-&Native)
①HTML中引入cordova.js
&script type=&text/javascript& src=&cordova.js&&&/script&
先做初始化处理,后根据cordova_plugins.js加载所有plugin的js文件。
②在deviceready事件中调用Camera
navigator.camera.getPicture(onSuccess,&onFail,&&&&&&&&&&&&&&&{&quality:&50,&&&&&&&&&&&&&&&&&allowEdit:&true,&&&&&&&&&&&&&&&&&destinationType:&destinationType.DATA_URL&});&&
③调用Camera.js的getPicture方法
assets\www\plugins\org.apache.cordova.camera\www\Camera.js
getPicture()
exec(successCallback, errorCallback, &Camera&, &takePicture&, args)
function androidExec(success, fail, service, action, args) ***cordova.js
var messages = nativeApiProvider.get().exec(service, action, callbackId, argsJson);
④调入Java的exec()方法
在CordovaWebView初期化的时候会根据Android的版本,将ExposedJsApi对象添加到CordovaWebView中。
this.addJavascriptInterface(exposedJsApi, &_cordovaNative&);
所以nativeApiProvider.get()的时候会根据 _cordovaNative 对象是否存在来判断是使用JavascriptInterface方式,还是使用prompt方式。
如果使用JavascriptInterface方式(Android 4.2以上版本),直接进入ExposedJsApi.java中定义了@JavascriptInterface标示的exec()方法 。
如果使用prompt方式,CordovaChromeClient.java中重写了onJsPrompt()方法,来调用exposedJsApi.exec()。
prompt(argsJson, 'gap:'+JSON.stringify([service, action, callbackId]));
总之入口都是exposedJsApi.exec().
@JavascriptInterface
public String exec(String service, String action, String callbackId, String arguments)
pluginManager.exec(service, action, callbackId, arguments);
PluginManager根据service调用获取到相应的CordovaPlugin
CameraLauncher.execute(String action, JSONArray args, CallbackContext callbackContext)
CameraLauncher根据action,这里是“takePicture”做本地API调用。
takePicture()
new Intent(&android.media.action.IMAGE_CAPTURE&);
cordova.startActivityForResult()
调用CordovaInterface(CordovaActivity-&Activity)的startActivityForResult
(3)回调的过程(Native-&JS)
①上述API调用成功后,在onActivityResult(CameraLauncher.java)设置结果
onActivityResult(int requestCode, int resultCode, Intent intent)
// Send Uri back to JavaScript for viewing image
this.callbackContext.success(uri.toString());
②退回到ExposedJsApi的exec()方法
jsMessageQueue.setPaused(false);
NativeToJsMessageQueue的onNativeToJsMessageAvailable()
sendMessageMethod = webViewCore.getClass().getDeclaredMethod(&sendMessage&, Message.class)
sendMessageMethod.invoke(webViewCore, execJsMessage)
③cordova.js中接收消息
androidExec.processMessages(messages)
processMessage(message)
cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback);
调用定义好的成功或者失败的JS回调函数。(payload为回传值)
以上就是完整的过程。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:324750次
积分:3911
积分:3911
排名:第5661名
原创:54篇
转载:177篇
评论:31条
(6)(16)(3)(2)(5)(21)(6)(3)(6)(33)(1)(24)(24)(1)(1)(1)(1)(28)(2)(1)(6)(1)(1)(2)(16)(1)(1)(1)(1)(4)(5)(5)(1)(1)(1)(2)安卓webview和js+html交互利用的addJavascriptInterface和webview.loadUrl(&javascript:**&); - 推酷
安卓webview和js+html交互利用的addJavascriptInterface和webview.loadUrl(&javascript:**&);
近期做一个项目需要把一个 服务支持的界面用webview来显示..呀 html白雪了js更是一样啥也不会,
相信很多初学屌丝员跟我一样,,html开发工具都不知道怎么写..哈哈哈.....现在把做完的结果分享一下
先上图了,,这是从项目中特意分离出来的demo
这里之上一些关键代码 源码下载地址
步骤 首先在assets目录下建一个html文件
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8& /&
&script type=&text/javascript&&
function createTable(phon){
var table = document.getElementById(&table&);
var arrya=phon.split(&;&);
var rowindex=0;
for(var i=0;i&arrya.i++){
child= arrya[i].split(&,&);
var row = table.insertRow(rowindex);//创建一行
rowindex+=1;
var cell1 = row.insertCell();//创建一个单元
cell1.innerHTML=child[0];
var cell2 = row.insertCell();//创建一个单元
cell2.innerHTML=&(&+i+&)&;
for(var n=1;n&child.n++){
var row = table.insertRow(rowindex);//创建一行
rowindex+=1;
var cell1 = row.insertCell();//创建一个单元
cell1.innerHTML= &&a href='javascript:Android.callPhone(\&&+child[n]+&\&)'&& +child[n];
}else if(i==1){
cell1.innerHTML= &&img src=\&file:///android_asset/qqicon.png\& height=\&14\& width=\&16\& & &+ &&a href='javascript:Android.callQQ(\&&+child[n]+&\&)'&& +child[n];
}else if(i==2){
cell1.innerHTML= &&img src=\&file:///android_asset/wxicon.png\& height=\&12\& width=\&16\& & &+ &&a href='javascript:Android.callWeixin(\&&+child[n]+&\&)'&& +child[n];
var cell2 = row.insertCell();
&font color=&#0099FF& size=&5&& 服务支持&/font& &/p&
&table id=&table& &
玩这个都玩了好久应为直接是eclipse开发 写一个function写了N遍老师少了逗号大括号还不报错。。。。郁闷的求推荐html+js的开发工具
算了还是整片的贴出来吧..html需要调用拨打电话这些功能就需要调用java类了这里我就需要定义一个java类实现html需要调用的方法
package com.example.
import ponentN
import android.content.C
import android.content.I
import android.content.pm.ApplicationI
import android.content.pm.PackageM
import android.content.pm.PackageManager.NameNotFoundE
import android.net.U
import android.webkit.JavascriptI
* JS的调用的方法
* @author yung
日 09:26:14
此类中的打开的QQ 和微信是直接通过包名和类名调用虽然QQ微信包名不容易变 但是主界面好事可能会变
如果发现打不开QQ微信应用可以查看是否是QQ微信升级更改了类名
public class AndroidJavaScript {
String[] qqpackage = new String[] { &com.tencent.mobileqq&,
&com.tencent.mobileqq.activity.SplashActivity& };
String[] wxpackage = new String[] { &com.tencent.mm&,
&com.tencent.mm.ui.LauncherUI& };
public AndroidJavaScript(Context c) {
@JavascriptInterface
public void callPhone(final String telphone) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(&tel:&
+ telphone));
c.startActivity(intent);
@JavascriptInterface
public void callQQ(String qq) {
// 实现调用电话号码
if (!checkBrowser(qqpackage[0])) {
Intent intent = new Intent();
ComponentName cmp = new ComponentName(qqpackage[0], qqpackage[1]);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(cmp);
c.startActivity(intent);
@JavascriptInterface
public void callWeixin(String weixin) {
if (!checkBrowser(wxpackage[0])) {
Intent intent = new Intent();
ComponentName cmp = new ComponentName(wxpackage[0], wxpackage[1]);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(cmp);
c.startActivity(intent);
// 获取在webview上获取js生成的html的源码
@JavascriptInterface
public void getSource(String htmlstr) {
// Log.e(&html&, htmlstr);
// String path = c.getFilesDir().getAbsolutePath() + &/serve.html&; //
// data/data目录
//检测包名的应用是否已经安装在手机
public boolean checkBrowser(String packageName) {
if (packageName == null || &&.equals(packageName))
ApplicationInfo info = c.getPackageManager().getApplicationInfo(
packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
} catch (NameNotFoundException e) {
现在有了方法有了html就差怎么调用了这样记得设置webview必要是参数
myWebView.addJavascriptInterface(new AndroidJavaScript(this), &Android&);
你是否发现html的js方法里面有酱紫的语句
&a href='javascript:Android.callWeixin(\&&+child[n]+&\&)'&&
确实这里面的”Android和“myWebView.addJavascriptInterface(new AndroidJavaScript(this), &Android&);必须相同哦..
这里注意双引号哈
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
isExistsHTML();
// myWebView.loadUrl(&file:///android_asset/ss.html&);
String path = getFilesDir().getAbsolutePath() + HTMLNAME; // data/data目录
myWebView.loadUrl(&file:///& + path);
myWebView.addJavascriptInterface(new AndroidJavaScript(this), &Android&);
// myWebView.loadUrl(&javascript:getStr('& + 122222 + &')&);
myWebView.setWebViewClient(webviewcilnt);
好把这里就解决了html里面调用java类实现的方法,,
下面说说 我这些QQ号和电话是从服务器获取的怎么添加到html上去。。这就是js的任务了
你看到我的html是没有什么布局,数据都是js生成出来的界面,。
怎么从java传到js里面呢 &?在java里面写myWebView.loadUrl(&javascript:createTable('& + phon + &')&);啦.
createTable(”“);就是js的function名字.记住这个myWebView.loadUrl(&javascript:createTable('& + phon + &')&)
在onCreate加应该是不行的需要酱紫
myWebView.setWebViewClient(webviewcilnt);
WebViewClient webviewcilnt = new WebViewClient() {
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String phon = loadHTMLData();
myWebView.loadUrl(&javascript:createTable('& + phon + &')&);
// 获取webview加载的html页面
view.loadUrl(&javascript:window.Android.getSource('&html&'+&
+ &document.getElementsByTagName('html')[0].innerHTML+'&/html&');&);
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
等待webview初始化html完成之后在调用js呵呵就这样啦转载请标明出处&
尊重作者 yung7086
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致2011人阅读
phonegap实践(1)
看到hybird app的优越性后,决定研究一下phonegap的使用方法。
把官网上cordova2.9.1下载后,发现里面的demo没法直接用,总是报错,后来发现是library包重复了,在java build path改一下,问题就解决了。
然后接下来发现cordovaWebView可以加载android assert里的html文件,但是加载不了外网的页面,例如百度。
而使用原生的WebView却可以正常加载,因此怀疑是cordovaWebView在作怪。
然后进行源码cordova2.9.0跟踪,发现cordovaWebView里的一处地方,如下
void loadUrlNow(String url) {
if (LOG.isLoggable(LOG.DEBUG) && !url.startsWith(&javascript:&)) {
LOG.d(TAG, &&&& loadUrlNow()&);
if (url.startsWith(&file://&) || url.startsWith(&javascript:&) || Config.isUrlWhiteListed(url)) {
super.loadUrl(url);
这里Config.isUrlWhiteListed(url),用一个网址白名单作为判断,继续跟踪Config,发现Config里有个方法addWhiteListEntry()可以添加白名单。
核心代码如下:
Config.init();
Config.addWhiteListEntry(&, true);
cordovaWebView.loadUrl(&&);
到这里添加了白名单之后就可以正常加载外网的网页了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29997次
排名:千里之外
原创:22篇
(1)(2)(2)(1)(6)(5)(2)(1)(1)(1)(1)4504人阅读
&wView.addJavascriptInterface(object, name);
这句话在android4.2版本以上会报错
提示None of the methods in the added interface have been annotated with @android.webkit.JavascriptI they will not be visible in API 17
解决办法:在object的方法上面加上&@JavascriptInterface &
借鉴别人的,自己记录一下。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12782次
排名:千里之外
转载:13篇
(1)(1)(1)(1)(2)(1)(1)(4)(1)(2)(1)(1)(2)(1)(2)Android开发中java与javascript交互:PhoneGap插件vs addJavascriptInterface -android100学习网
Android开发中java与javascript交互:PhoneGap插件vs addJavascriptInterface
1. 前言在《用PhoneGap+jQueryMobile开发Android应用实例》中,我们讲到PhoneGap(以下称Cordova)开发环境的搭建,以及如何整合出一个基本
1.&&&&&&& 前言
在《用PhoneGap+jQueryMobile开发Android应用实例》中,我们讲到PhoneGap(以下称Cordova)开发环境的搭建,以及如何整合出一个基本的Android应用框架(并给出了范例代码)。于是乎,我们便开始日夜兼程,披星戴月的炮制我们的第一个手机应用了。
但实际上,除了常见的API调用规范(有且仅有自查手册一途)引起的问题之外,我们仍然会遇到其他形形色色的各种问题。那么在这篇文章中,我们谈谈java与js之间的交互问题(哦,目前仅关注Android,所以只能谈java了)。当然,二者之间的交互目的,原因会有种种不同,但应该还是以发挥语言各自的优势,提供接口给对方调用的意图居多。
我们知道,在Android平台下,Cordova是通过内置WebKit内核的方式来实现界面容器的(事实上,在其他平台也是如此)。我们也同样知道,Cordova是一个桥接框架,其目的就是为原生API和js建立桥接,互通有无的。为了便于我们扩展自己的应用,Cordova还提供了插件(PlugIn)机制(当然,我们还可以直接修改Cordova开源代码)。只要遵循一定的规则(恩恩,事实上这个规则很简单),就可以扩展出丰富的功能特效来。
2.&&&&&&& Cordova插件与 WebView.addJavascriptInterface
恩恩,本文的主题是java与js的交互(差点跑了)。刚提到的,Cordova有插件机制,可以通过插件的形式,实现java与js交互,为什么还要提到addJavascriptInterface?
Cordova插件确实可以实现二者的交互,而且是异步的,非常方便。但基于一些特殊的原因,例如:一个回调需要被多次调用(啊哈,或许是我太菜?使用PlugIn注册的回调都只能被调用一次)。又或者不想写插件,想直接点。
总之,插件也并不是时时处处都符合我们的需求(我们的欲望无穷大啊),总是要找办法解决,寻点不同的路出来(个人不是特别认同Cordova的Hack方式,遑论其插件;而且Cordova目前的状态有点怪异,版本更新是很快,但文档更新不同步)。要真正成熟,还是有一段路要走的。
addJavascriptInterface则是WebKit的原生API,属于WebView对象的公共方法,用于暴露一个java对象给js,使得js可以直接调用java方法。当然,我们要实现java与js的双向交互,还需要另一个方法loadUrl(同属于WebView对象,Cordova也是采用的这个方法调用js的)的配合。
当然,这两种方式互有优劣(只有实践时,才会明白啊)。Cordova插件的不足刚才已经提过;而addJavascriptInterface也有些问题,一是Android平台封装WebKit内核时,不同的版本中有些许不一致;其次,直接使用loadUrl加载js实在是让人头疼。
其实应该有更好的方法,比如扩展js引擎(我更喜欢这种方式),但这种方式相对而言,涉及的内容繁杂,暂时不纳入这次的话题。
3.&&&&&&& Cordova插件的实现
Cordova插件分为两个部分(额,Cordova本身也是分为两个部分的,别扭不?),一部分由java实现,另一部分由js实现。
1)&&&&&&& java部分
Cordova插件的java部分很简单,继承Cordova.Plugin,实现execute方法就可以了:
public classNotificationClient extends Plugin {
&&&&&&&& private static final String TAG ="NotificationClient";
&&&&&&&& private String callbackId ="";
&&&&&&&& public PluginResult execute(Stringaction, JSONArray args, String callbackId) {
&&&&&&&&&&&&&&&&&& PluginResult.Status status =PluginResult.Status.OK;
&&&&&&&&&&&&&&&&&& if(action.equals("register")){
&&&&&&&&&&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& register(args.getString(0),args.getString(1));
&&&&&&&&&&&&&&&&&&&&&&&&&&& } catch(JSONException e) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& status =PluginResult.Status.JSON_EXCEPTION;
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&& } elseif(action.equals("watch")) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& this.callbackId =callbackId;
&&&&&&&&&&&&&&&&&&&&&&&&&&& PluginResult r = newPluginResult(PluginResult.Status.NO_RESULT);
&&&&&&&&&&&&&&&&&&&&&&&&&&& r.setKeepCallback(true);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& } else {
&&&&&&&&&&&&&&&&&&&&&&&&&&& status =PluginResult.Status.INVALID_ACTION;
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&& return newPluginResult(status);
&&&&&&&& }
&&&&&&&& public Object onMessage(String id,Object data) {
&&&&&&&&&&&&&&&&&& Log.d(TAG,"onMessage(" + id + ").");
&&&&&&&&&&&&&&&&&& if(id.equals("onClientNotification")){
&&&&&&&&&&&&&&&&&&&&&&&&&&& if(!callbackId.equals("")){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& this.success("true",callbackId);
&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&
&&&&&&&& }
&&&&&&&& private void register(String username,String phone) {
&&&&&&&&&&&&&&&&&& Log.d(TAG,"register(" + username + ", " + phone + ").");
&&&&&&&& }
嗯,就这样,作为一个Cordova插件java部分的范例,他已经完成了使命(原谅我为了节省篇幅,删掉了注释和空行;不必太多介怀,参考资源里有很多范例工程可以学习)。
不得不说,Cordova还是做了很多工作的,为了减轻插件开发的工作量,对js的调用进行了很多的包装(回头看看loadUrl是多么的贫瘠的时候,才会有如此感慨吧)。
2)&&&&&&& js部分
唉,让我浑身别扭的部分来了。说到js部分,我接触过的版本里(当然,我也仅仅接触过3个版本而已:1.0、2.0、2.1)已经有两种写法。嗯,从执行效果上来说,2.0是兼容1.0的写法的(哦哦,前提是我做了一些改动,虽然改动很小);美中不足的是,跟踪脚本时还是会报错,虽然不影响脚本的继续加载。
先来看看第一种写法吧(1.0的写法):
functionNotificationClient() { }
NotificationClient.prototype.register= function(userName, phone) {
&&&&&&&& PhoneGap.exec(null, null,"NotificationClient", "register", [ userName, phone ]);
NotificationClient.prototype.watch= function(fn) {
&&&&&&&& PhoneGap.exec(fn, null,"NotificationClient", "watch", []);
PhoneGap.addConstructor(function(){
&&&&&&&& if(typeof navigator.notificationClient== "undefined")
&&&&&&&&&&&&&&&&&& navigator.notificationClient= new NotificationClient();
网上的教程都是这么弄的,事实上运行时会报错:找不到PhoneGap对象;更严重的是navigator.notificationClient在运行时根本无法访问。
当然,如果你改成这样:
// PhoneGap.addConstructor(function(){
&&&&&&&& if(typeof navigator.notificationClient== "undefined")
&&&&&&&&&&&&&&&&&& navigator.notificationClient= new NotificationClient();
程序是可以正常运行的,虽然仍然会报错。
OK,再来看看第二种(2.0的写法):
cordova.define("cordova/plugin/notificationClient",function(require, exports, module){
&&&&&&&& var exec = require('cordova/exec');
&&&&&&&& var NotificationClient = function() {};
&&&&&&&& NotificationClient.prototype.register =function(userName, phone) {
&&&&&&&&&&&&&&&&&& exec(null, null,"NotificationClient", "register", [ userName, phone ]);
&&&&&&&& };
&&&&&&&& NotificationClient.prototype.watch =function(fn) {
&&&&&&&&&&&&&&&&&& exec(fn, null,"NotificationClient", "watch", []);
&&&&&&&& };
&&&&&&&& var notificationClient = newNotificationClient();
&&&&&&&& module.exports = notificationC
if(!window.plugins) {
&&&&&&&& window.plugins = { };
if(!window.plugins.notificationClient) {
&&&&&&&& window.plugins.notificationClient =cordova.require("cordova/plugin/notificationClient");
恩,这种写法没有任何错误了,而且能正常运行,开心。
3)&&&&&&& 注册插件
把插件写完之后,还需要注册,插件才能在Cordova下使用。找到工程目录下的res\xml目录,1.0打开plugins.xml文件,2.0打开config.xml文件,在plugins节点下加入:
&pluginname="NotificationClient"value="cn.yofang.mobile.NotificationClient"/&
至此,NotificationClient插件就可以在js中调用了。
1.0的用法:
navigator.notificationClient.register("azhi","");
2.0的用法:
window.plugins.notificationClient.register("azhi","");
4.&&&&&&& WebView.addJavascriptInterface实现
啊,终于到addJavascriptInterface了,每次文档写到一半左右都手酸呐(看文档的人是不是也暗叹了一声:终于来了)。
addJavascriptInterface比起Cordova插件来更加的简单,首先我们来定义一个类:
public classNotificationClient {
&&&&&&&& private static final String TAG ="NotificationClient";
&&&&&&&& private Context context =
&&&&&&&& private CordovaWebView view =
&&&&&&&& private String callback = "";
&&&&&&&& public NotificationClient(Contextcontext, CordovaWebView view) {
&&&&&&&&&&&&&&&&&& this.context =
&&&&&&&&&&&&&&&&&& this.view =
&&&&&&&& }
&&&&&&&& public void register(String user,String mobile, String callback) {
&&&&&&&&&&&&&&&&&& Log.d(TAG, "register(user: " + user + ", mobile: " + mobile + ", callback:" + callback + " )");
&&&&&&&&&&&&&&&&&& this.callback =
&&&&&&&&&&&&&&&&&& checkMessage();
&&&&&&&& }
&&&&&&&& public void checkMessage() {
&&&&&&&&&&&&&&&&&& SharedPreferences sp =context.getSharedPreferences("NotificationClient", 0);
&&&&&&&&&&&&&&&&&& int message =Integer.valueOf(sp.getInt("Message", 0));
&&&&&&&&&&&&&&&&&& Log.d(TAG,"checkMessage(): " + message);
&&&&&&&&&&&&&&&&&& if(message & 0) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& Editor editor =sp.edit();
&&&&&&&&&&&&&&&&&&&&&&&&&&& editor.putInt("Message",0);
&&&&&&&&&&&&&&&&&&&&&&&&&&& mit();
&&&&&&&&&&&&&&&&&&&&&&&&&&& newHandler().post(new Runnable() {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public voidrun() {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& view.sendJavascript(callback);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&& });
&&&&&&&&&&&&&&&&&& }
&&&&&&&& }
这个类的意图很简单(嗯,跟上面Cordova插件的NotificationClient插件很相似对不对?):提供一个register方法供js调用,传入相应的参数增加了一个callback,在合适的时机(通过SharedPreferences检查Message标志,大于0则认为是合适的时机了),从java端调用这个callback(当然,代码里使用了SharedPreferences、Handler等其他的Android原生对象,大家暂时忽略就是)。
嚯,我是不是没有用loadUrl,而是用的sendJavascript?sendJavascript是Cordova对WebView封装后提供的方法,其实把那一句改成:
view.loadUrl("javascript:"+ this.callback);
效果是一样的(当然,如果你不是用Cordova,而是自己写的Activity,那么你就必须得这么写了)。
好了,类写完了,下面就应该把这个类暴露给js了:
appView.getSettings().setJavaScriptEnabled(true);&&&& // 暴露之前,先开启javascript
appView.addJavascriptInterface(newNotificationClient(this, appView), "notificationClient");
嗯,这里用到了appView(DroidGap的成员变量),我们使用的Cordova嘛,所以用这个没有罪过的。如果是直接实现的Activity,就要自己内嵌WebView了,把appView改成自己的WebView对象即可。
&&&&&&&& 再就是js里的用法了:
window.notificationClient.register("azhi","","OnMessage();");
大家看到了,在js中调用时,还是比较方便的,不需要预先建立js类对象,通过addJavascriptInterface添加的对象直接就附加在window对象上了。但弊端也是很明显,看看我们的callback,是以代码形式传入的(当然了,其实是可以改良的,但今天就不聊这个了)。
&&&&&&&& 呵呵,稍微来点结束语:就这样吧,希望大家都有所收获。

我要回帖

更多关于 cordovawebview 的文章

 

随机推荐