cordova详解及介绍

一、Cordova 核心java类说明

 

CordovaActivity:Cordova Activity入口,已实现PluginManager、WebView的相关初始化工作, 只需继承CordovaActivity实现自己的业务需求。

PluginManager: 插件管理器

ExposedJsApi :javascript调用Native, 通过插件管理器PluginManager 根据service找到具体实现类。

NativeToJsMessageQueue:Native调用javascript,主要包括三种方式:loadUrl 、 轮询、反射WebViewCore执行js

 

二、 Cordova框架类图

 

三、Cordova框架启动

 

当实现了DroidGap或者CordovaInterface接口的Activity的onCreate方法中调用DroidGap的loadUrl方法即启动了Cordova框架。

 

Cordova提供了一个Class(DroidGap extends CordovaActivity)和一个interface(CordovaInterface)来让Android开发者开发Cordova。

一般情况下实现DroidGap即可,因为DroidGap类已经做了很多准备工作,可以说DroidGap类是Cordova框架的一个重要部分;如果在必要的情况下实现CordovaInterface接口,那么这个类中很多DroidGap的功能需要自己去实现。继承了DroidGap或者CordovaInterface的Activity就是一个独立的Cordova模块,独立的Cordova模块指的是每个实现了DroidGap或者CordovaInterface接口的Activity都对应一套独立的WebView,Plugin,PluginManager,没有共享的。

 

在初始化完CordovaWebView后调用CordovaWebView.loadUrl()。此时完成Cordova的启动。


1.Cordova关联对象初始化

在实例化CordovaWebView的时候, CordovaWebView对象会去创建一个属于当前CordovaWebView对象的插件管理器PluginManager对象,一个消息队列NativeToJsMessageQueue对象,一个JavascriptInterface对象ExposedJsApi,并将ExposedJsApi对象添加到CordovaWebView中,JavascriptInterface名字为:_cordovaNative。


2. Cordova的JavascriptInterface
在创建ExposedJsApi时需要CordovaWebView的PluginManager对象和NativeToJsMessageQueue对象。因为所有的JS端与Android native代码交互都是通过ExposedJsApi对象的exec方法。在exec方法中执行PluginManager的exec方法,PluginManager去查找具体的Plugin并实例化然后再执行Plugin的execute方法,并根据同步标识判断是同步返回给JS消息还是异步。由NativeToJsMessageQueue统一管理返回给JS的消息。


3. 何时加载Plugin,如何加载
 Cordova在启动每个Activity的时候都会将配置文件中的所有plugin加载到PluginManager。那么是什么时候将这些plugin加载到PluginManager的呢?在b中说了最后会调用CordovaWebView.loadUrl(),对,就在这个时候会去初始化PluginManager并加载plugin。PluginManager在加载plugin的时候并不是马上实例化plugin对象,而是只是将plugin的Class名字保存到一个hashmap中,用service名字作为key值。
当JS端通过JavascriptInterface接口的ExposedJsApi对象请求Android时,PluginManager会从hashmap中查找到plugin,如果该plugin还未实例化,利用java反射机制实例化该plugin,并执行plugin的execute方法。


4.Cordova的数据返回

Cordova中通过exec()函数请求android插件,数据的返回可同步也可以异步于exec()函数的请求。在开发android插件的时候可以重写public boolean isSynch(String action)方法来决定是同步还是异步。Cordova在android端使用了一个队列(NativeToJsMessageQueue)来专门管理返回给JS的数据。

   
1)同步
   Cordova在执行完exec()后,android会马上返回数据,但不一定就是该次请求的数据,可能是前面某次请求的数据;因为当exec()请求的插件是允许同步返回数据的情况下,Cordova也是从NativeToJsMessageQueue队列头pop头数据并返回。然后再根据callbackID反向查找某个JS请求,并将数据返回给该请求的success函数。
   
2)异步
   Cordova在执行完exec()后并不会同步得到一个返回数据。Cordova在执行exec()的同时启动了一个XMLHttpRequest对象方式或者prompt()函数方式的循环函数来不停的去获取NativeToJsMessageQueue队列中的数据,并根据callbackID反向查找到相对应的JS请求,并将该数据交给success函数。
   注:Cordova对本地的HTML文件(file:// 开头的URL)或者手机设置有代理的情况下使用XMLHttpRequest方式获取返回数据,其他则使用prompt()函数方式获取返回数据。

 

5、webView.sendJavascript 发送到js队列,onNativeToJsMessageAvailable 负责执行js.

 

Native 调用 JS 执行方式有三种实现 LoadUrlBridgeMode、 OnlineEventsBridgeMode、PrivateApiBridgeMode

1、webView.sendJavascript 发送js方法到JS队列

2、onJsPrompt 方法拦截,获取调用方式

》》如果是gap_bridge_mode,则执行 appView.exposedJsApi.setNativeToJsBridgeMode(Integer.parseInt(message));
》》如果是gap_poll, 则执行 appView.exposedJsApi.retrieveJsMessages("1".equals(message));

3、调用setBridgeMode 方法调用onNativeToJsMessageAvailable 执行javascript调用

 

四、Native调用javascript 方式:NativeToJsMessageQueue


1、loadUrl javascript 调用方式

 

1
2
3
4
5
private  class  LoadUrlBridgeMode  extends  BridgeMode
 
if  (url.startsWith( "file://" ) || url.startsWith( "javascript:" ) || Config.isUrlWhiteListed(url)) {
 
}

  


2、Navitive事件通知javascript轮询获取Navitive数据

 

1
2
3
private  class  OnlineEventsBridgeMode  extends  BridgeMode

  

3、通过Java反射获取webview 的sendMessage 方法执行js, 支持 Android 3.2.4之上(包含)

 

---可以解决loadUrl 隐藏键盘的问题:当你的焦点在输入,如果这通过loadUrl调用js,会导致键盘隐藏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private  class  PrivateApiBridgeMode  extends  BridgeMode
 
     Field f = webViewClass.getDeclaredField( "mProvider" );
     f.setAccessible( true );
     webViewObject = f.get(webView);
     webViewClass = webViewObject.getClass();
 
     Field f = webViewClass.getDeclaredField( "mWebViewCore" );
     f.setAccessible( true );
     webViewCore = f.get(webViewObject);
 
    if  (webViewCore !=  null ) {
         sendMessageMethod =       webViewCore.getClass().getDeclaredMethod( "sendMessage" , Message. class );
        sendMessageMethod.setAccessible( true );  
     }
 
      Message execJsMessage = Message.obtain( null , EXECUTE_JS, url);
      sendMessageMethod.invoke(webViewCore, execJsMessage);

  


4、Native注册javascript接口 _cordovaNative

 

1
2
3
4
5
6
7
8
9
10
11
12
13
boolean  isHoneycomb = (SDK_INT >= Build.VERSION_CODES.HONEYCOMB && SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR2);
// Bug being that Java Strings do not get converted to JS strings automatically.This isn't hard to work-around on the JS side, but it's easier to just use the prompt bridge instead.
if  (isHoneycomb || (SDK_INT < Build.VERSION_CODES.GINGERBREAD)) {
Log.i(TAG,  "Disabled addJavascriptInterface() bridge since Android version is old." );
return ;
else  if  (SDK_INT < Build.VERSION_CODES.HONEYCOMB && Build.MANUFACTURER.equals( "unknown" )) {
// addJavascriptInterface crashes on the 2.3 emulator.
Log.i(TAG,  "Disabled addJavascriptInterface() bridge callback due to a bug on the 2.3 emulator" );
return ;
}
this .addJavascriptInterface(exposedJsApi,  "_cordovaNative" );
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cordova是一个开源的移动应用开发框架,它允许开发者使用HTML、CSS和JavaScript来构建跨平台的移动应用程序。Cordova提供了一组API,可以访问设备的原生功能,如摄像头、文件系统、联系人等。通过使用Cordova,开发者可以使用熟悉的Web技术来创建移动应用,而无需学习平台特定的编程语言或工具。 要学习Cordova,你可以按照以下步骤进行: 1. 了解基本的Web开发技术:在学习Cordova之前,建议你先掌握HTML、CSS和JavaScript等基本的Web开发技术,因为Cordova使用这些技术来构建应用程序界面和逻辑。 2. 安装Cordova:你需要在本地环境中安装Cordova。可以通过npm(Node Package Manager)来安装Cordova命令行工具。具体的安装步骤可以参考Cordova官方文档。 3. 创建Cordova项目:使用Cordova命令行工具创建一个新的Cordova项目。在项目中,你可以定义应用程序的名称、包名、支持的平台等信息。 4. 编写应用程序代码:在Cordova项目中,你可以使用HTML、CSS和JavaScript来编写应用程序的界面和逻辑。你可以使用各种前端框架(如AngularJS、React等)来加快开发速度。 5. 添加插件:Cordova提供了一系列的插件,用于访问设备的原生功能。你可以使用Cordova命令行工具来添加这些插件到你的项目中,并在应用程序中使用它们。 6. 构建和运行应用程序:使用Cordova命令行工具,你可以构建应用程序的二进制文件,并将其部署到模拟器、真机或浏览器中进行测试。 7. 学习和解决问题:在学习过程中,你可能会遇到一些问题或困惑。可以参考Cordova官方文档、社区论坛或其他在线资源来获取帮助和解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值