最近有个外包项目,需要用到PhoneGap,之前对Cordova和PhoneGap两者的关系有点错乱,做了这个项目才知道他们的关系。Cordova是Phonegap的儿子,但是对于商业用途来说,我还是建议大家使用PhoneGap,因为PhoneGap的代码结构比Cordova更加简洁,市面上的招聘也是招PhoneGap居多。
用PhoneGap来load url,可能是大部分项目都是用JQuery Mobile存在放本地作为资源,所以加载速度比较快,这个加载的等待提示很容易被忽略。尤其是,需要加载网络上的地址的时候。
参考了这篇博文:http://blog.csdn.net/tommychen1228/article/details/8788340 发现Log的方法没有被调用,我以为在onStarted等方法里面不可以打印日志,可能跟浏览器有关,于是我找到了一个兼容4.0以上的版本用了一个IceCreamCordovaWebViewClient去兼容,结果发现,在4.0+的系统根本不调用IceCreamCordovaWebViewClient。
使用了自己定义的布局,当然要使用CordovaWebView。
<org.apache.cordova.CordovaWebView
android:id="@+id/tutorialView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
折腾了一番终于发现了问题,原来这个监听信息的传递需要需要通过webview自身的postMessage来实现。
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//we use CordovaWebView postMessage() to CordovaInterface
//like handle to get what CordovaWebView has sent
//post format like message_id,content
webView.postMessage("onPageStarted ", url);
super.onPageStarted(view, url, favicon);
}
发送消息有了,则需要获取这个发送的消息,需要实现CordovaInterface的Object onMessage(String id, Object data)方法,特别要注意的是,当data为空的时候,打印信息会报错。
@Override
public Object onMessage(String id, Object data) {
//here is for get the data what CordovaWebView has sent
//rememeber to check if data is not null
//becuz when CordovaWebView has been destoryed it still post a null message like about:blank
if(data!=null){
Log.e("post message",data.toString()+" "+id);
}
return data;
}
@Override
protected void onDestroy() {
//remember to cleanup all PhoneGap related stuff
//handleDestroy() will cleanup stuff like the PluginManager, broadcast receivers
if(webView!=null){
webView.handleDestroy();
}
super.onDestroy();
}
项目代码: https://github.com/arjinmc/PhoneGapDemo