转载请注明出处:http://blog.csdn.net/awebkit

结合 phonegap揭秘-流程 我们本节研究里面的一些小细节:phonegap如何管理插件。

废话少说,开始吧

phonegap 要求 Activity 继承于 DroidGap ,首先看看 DroidGap 的说明中关于如何使用 DroidGap

 *     public class Examples extends DroidGap {*       @Override*       public void onCreate(Bundle savedInstanceState) {*         super.onCreate(savedInstanceState);*                  *         // Set properties for activity*         super.setStringProperty("loadingDialog", "Title,Message"); // show loading dialog*         super.setStringProperty("errorUrl", "file:///android_asset/www/error.html"); // if error loading file in super.loadUrl().**         // Initialize activity*         super.init();*         *         // Add your plugins here or in JavaScript*         super.addService("MyService", "com.phonegap.examples.MyService");*         *         // Clear cache if you want*         super.appView.clearCache(true);*         *         // Load your application*         super.setIntegerProperty("splashscreen", R.drawable.splash); // load splash.jpg image from the resource drawable directory*         super.loadUrl("file:///android_asset/www/index.html", 3000); // show splash screen 3 sec before loading app*       }*     }

DroidGap 的onCreate 函数和普通的 activity 的 onCreate 函数没什么区别,这里就不介绍了,主要介绍 init 函数,注意,精华啊!

public void init() {// Create web containerthis.appView = new WebView(DroidGap.this);this.appView.setId(100);this.appView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT, 1.0F));WebViewReflect.checkCompatibility();if (android.os.Build.VERSION.RELEASE.startsWith("1.")) {this.appView.setWebChromeClient(new GapClient(DroidGap.this));}else {this.appView.setWebChromeClient(new EclairClient(DroidGap.this));         }this.setWebViewClient(this.appView, new GapViewClient(this));this.appView.setInitialScale(100);this.appView.setVerticalScrollBarEnabled(false);this.appView.requestFocusFromTouch();// Enable JavaScriptWebSettings settings = this.appView.getSettings();settings.setJavaScriptEnabled(true);settings.setJavaScriptCanOpenWindowsAutomatically(true);settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);// Enable databasePackage pack = this.getClass().getPackage();String appPackage = pack.getName();WebViewReflect.setStorage(settings, true, "/data/data/" + appPackage + "/app_database/");// Enable DOM storageWebViewReflect.setDomStorage(settings);// Enable built-in geolocationWebViewReflect.setGeolocationEnabled(settings, true);// Bind PhoneGap objects to JavaScriptthis.bindBrowser(this.appView);// Add web view but make it invisible while loading URLthis.appView.setVisibility(View.INVISIBLE);root.addView(this.appView);setContentView(root);// Clear cancel flagthis.cancelLoadUrl = false;// If url specified, then load itString url = this.getStringProperty("url", null);if (url != null) {System.out.println("Loading initial URL="+url);this.loadUrl(url);          }}

首先是创建 WebView ,然后是标准的设置 WebView 相关,如 WebViewClient ChromeClient,最后是 loadUrl。这部分代码里面有一个不是标准的接口 bindBrowser ,这是做什么的呢?我们看一下代码

 private void bindBrowser(WebView appView) {this.callbackServer = new CallbackServer();this.pluginManager = new PluginManager(appView, this);}

啊,这部分代码很简单,但是作用很大,初始化了PluginManager ,而我们知道,类似 camera ,这些都是 Plugin ,那我们看看 PluginManager 的创建吧

 public PluginManager(WebView app, PhonegapActivity ctx) {this.ctx = ctx;this.app = app;this.loadPlugins();}/*** Load plugins from res/xml/plugins.xml*/public void loadPlugins() {XmlResourceParser xml = ctx.getResources().getXml(com.phonegap.R.xml.plugins);int eventType = -1;while (eventType != XmlResourceParser.END_DOCUMENT) {if (eventType == XmlResourceParser.START_TAG) {String strNode = xml.getName();if (strNode.equals("plugin")) {String name = xml.getAttributeValue(null, "name");String value = xml.getAttributeValue(null, "value");System.out.println("Plugin: "+name+" => "+value);this.addService(name, value);}}try {eventType = xml.next();} catch (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

我们看到了 loadPlugins 装载插件,用到的xml文件是 plugins ,这个文件如下

<!--?xml version="1.0" encoding="utf-8"?-->
<plugins><plugin name="App" value="com.phonegap.App"/><plugin name="Geolocation" value="com.phonegap.GeoBroker"/><plugin name="Device" value="com.phonegap.Device"/><plugin name="Accelerometer" value="com.phonegap.AccelListener"/><plugin name="Compass" value="com.phonegap.CompassListener"/><plugin name="Media" value="com.phonegap.AudioHandler"/><plugin name="Camera" value="com.phonegap.CameraLauncher"/><plugin name="Contacts" value="com.phonegap.ContactManager"/><plugin name="Crypto" value="com.phonegap.CryptoHandler"/><plugin name="File" value="com.phonegap.FileUtils"/><plugin name="Location" value="com.phonegap.GeoBroker"/><plugin name="Network Status" value="com.phonegap.NetworkManager"/><plugin name="Notification" value="com.phonegap.Notification"/><plugin name="Storage" value="com.phonegap.Storage"/><plugin name="Temperature" value="com.phonegap.TempListener"/><plugin name="FileTransfer" value="com.phonegap.FileTransfer"/><plugin name="Capture" value="com.phonegap.Capture"/>
</plugins>

解析完xml文件后,pluginManager 调用了 addService ,那么这个函数做了什么事情呢?

    public void addService(String serviceType, String className) {this.services.put(serviceType, className);}

哦?只是简单的放到一个 HashMap 中吗?我们现在知道 PluginManager 储存了一个 service 和对应类的一个列表,那么什么时候用呢?
    回过头来,我们再看一下测试例子, phonegap.js 定义了 js camera 类 。而在这个 js 类的方法 getPicture 中会调用 phonegap.exec。

Camera.prototype.getPicture = function(successCallback, errorCallback, options) {
...
PhoneGap.exec(successCallback, errorCallback, "Camera", "takePicture", [quality, destinationType, sourceType]);
};

通过phonegap揭秘-流程 我们知道 PhoneGap.exec 最终通过 prompt 调用到 java 里面。

这篇的基本思路在 phonegap揭秘-流程 已经讲过,所以说是题外篇,我会接着分析一下最新版本的 PhoneGap 流程,变动比较大,但是我觉得整体架构差不多一样的

phonegap揭秘附篇:phonegap的插件管理相关推荐

  1. 【Qt】通过QtCreator源码学习Qt(七):插件管理类简介

    一.名字空间:ExtensionSystem ExtensionSystem命名空间提供了属于核心插件系统的类. ExtensionSystem包含插件管理器及其支持类,以及必须由插件提供者实现的IP ...

  2. 【Qt】通过QtCreator源码学习Qt(四):插件管理PluginManager

    1.简介 QtCreator使用插件架构,方便扩展.它的核心是插件管理,主类是PluginManager. 下面是翻译src\libs\extensionsystem\pluginmanager.cp ...

  3. Vim Vundle 插件管理器

    /*********************************************************************** Vim Vundle 插件管理器* 说明:* 话说Vi ...

  4. 【Flutter】Flutter 项目中使用 Flutter 插件 ( Flutter 插件管理平台 | 搜索 Flutter 插件 | 安装 Flutter 插件 | 使用 Flutter 插件 )

    文章目录 一.Flutter 包和插件管理平台 二.Flutter 插件搜索示例 三.Flutter 插件装示例 1.添加 Dart 包依赖 2.获取 Dart 包 3.使用 Dart 包 4.官方的 ...

  5. Jenkins持续集成环境之插件管理和角色管理

    1.持续集成环境-Jenkins插件管理 Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用.例如从Gitlab拉取代码,使用Maven构建项目等 功能需要依靠插件完成.接下来演示 ...

  6. notepad++添加插件管理器

    notepad++ 是一个很不错的文本编辑器,添加一些插件可以更好地使用. 首先需要使用插件管理器,最新版本的github地址是:https://github.com/bruderstein/nppp ...

  7. OpenCASCADE:Foundation Classes之插件管理

    OpenCASCADE:Foundation Classes之插件管理 按插件分发 C++ 插件实现 C++ 客户端插件实现 按插件分发 插件是可以动态加载到客户端应用程序中的组件,不需要直接链接到它 ...

  8. linux vim 插件管理,linux: vim插件管理

    gmarik/Vundle.vim是目前被推荐次数更多的Vim插件管理器,超过了pathogen.这里我们 就用vundle来作为Vim的插件管理工具. 1.安装Vundle.vim Vundle.v ...

  9. Jenkins 插件管理与系统设置

    一.插件管理 我们前面讲了,Jenkins是一个引擎,他本身的功能很简单,是通过各种不同的插件实现编译部署项目. 1.自动插件安装 登录web页面,点击系统管理: 点击管理插件: 点击可选插件,选择你 ...

最新文章

  1. 数学图形(1.20)N叶草
  2. Python 工程管理及 virtualenv 的迁移
  3. 使用 C# 运行符号测试
  4. [转]RxHttp 一条链发送请求,新一代Http请求神器(一)
  5. ipynb文件转为python(.py)文件
  6. JavaScript 和 typeScript 中的 import、from
  7. 公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂
  8. Silverlight 动画性能
  9. 气象数据产品下载网址汇总
  10. 实验1构建多连杆机器人模型
  11. linux 该文件的owner,Linux修改文件/目录的owner/group方法(转载)
  12. nvme协议 sata接口_NVMe/SATA SSD有啥不一样?萌新怎么选
  13. table表格做一个表头斜线样式
  14. 查找网站的IP地址的两种方法
  15. WINDOWS 7全系列验证码
  16. 抢红包算法--四种抢红包算法对比(附源码)
  17. 基于Python实现的孤立词语音识别系统
  18. c语言成绩筛选,c语言筛选质数
  19. ajax+json自动提示Demo
  20. 站长在线零基础Python完全自学教程20:在Python中使用正则表达式完全解读

热门文章

  1. 后市如何操作-----把握市场主热点从题材股向蓝筹股转换的时机!!!!!!
  2. ubuntu 桌面操作系统安装WPS办公软件的方法
  3. 数字出版是个伪概念,没有钱途
  4. 如何在R中绘制热力地图
  5. 序列预测中损失函数详解-MAE、MAPE、RMSE、Huber
  6. 目前记录♡最详细的一篇记录学习笔记 ---Python爬虫(18) selenium自动化安装和使用
  7. 关键绩效指标法(Key Performance Indicator,KPI)
  8. 关于Windows_8.1/Windows 7下普通用户运行软件提示需要输入管理员密码解决方法
  9. 关于WIN7共享权限问题*****共享之后只能复制不能粘贴*****解决方法
  10. MemBlaze闪存加速卡PBlaze3的极致新体验