PhoneGap/Cordova是一个专业的移动应用开发框架,是一个全面的WEB APP开发的框架,提供了以WEB形式来訪问终端设备的API的功能。
这对于採用WEB APP进行开发人员来讲是个福音。这可以避免了原生开发的某些功能。javascript
Cordova 仅仅是个原生外壳,app的内核是一个完整的webapp。需要调用的原生功能将以原生插件的形式实现,以暴露js接口的方式调用。html
Cordova Android项目是Cordova Android原生部分的Java代码实现。提供了Android原生代码和上层Web页面的javascript通信接口。本系列文章主要分析Cordova Android框架代码的实现。经过深刻分析cordova Android源代码的实现,咱们在开发HybridApp时可以更从容,知道Cordova的插件的工做原理。开发cordova插件整合本身的功能模块。在实现web应用时避开js和webview的一些坑。开发出高质量的混合应用。
项目源代码可以在https://git-wip-us.apache.org/repos/asf找到。上面展现了cordova全部子项目的git地址。当你建立cordova应用,并经过cordova platform add Android命令加入android平台后,在应用的platforms/android/CordovaLib/src/org/apache/cordova文件夹如下可以找到Cordova Android框架代码。 java
cordova3.5版本号Android核心框架一共同拥有27个java文件,代码量不算大。从cordova3.0版本号之后。全部的设备能力API都从cordova核心框架分离出去,变成了插件,各平台分别进行原生实现,好比訪问设备信息的Device插件,訪问网络状态的Network Information插件。眼下官方站点一共收录了250个插件。如下是 Cordova Android的整体UML类图,从这张图上咱们看出核心框架和插件之间的关系。插件需要实现CordovaPlugin接口。android
Cordova框架类图git
- CordovaInterface接口分析
CordovaInterface是Cordova应用的底层接口,CordovaActivity需要实现这个接口。web
用来隔离Cordova插件开发,隔离插件对Cordova核心库的直接依赖。apache
主要方法有startActivityForResult。setActivityResultCallback,getActivity,onMessage。getThreadPool这几个接口方法。详细的实现在CordovaActivity中。网络
/** * The Activity interface that is implemented by CordovaActivity. * It is used to isolate plugin development, and remove dependency on entire Cordova library. */ public interface CordovaInterface { /** * Launch an activity for which you would like a result when it finished. When this activity exits, * your onActivityResult() method will be called. * * @param command The command object * @param intent The intent to start * @param requestCode The request code that is passed to callback to identify the activity */ abstract public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode); /** * Set the plugin to be called when a sub-activity exits. * * @param plugin The plugin on which onActivityResult is to be called */ abstract public void setActivityResultCallback(CordovaPlugin plugin); /** * Get the Android activity. * * @return the Activity */ public abstract Activity getActivity(); /** * Called when a message is sent to plugin. * * @param id The message id * @param data The message data * @return Object or null */ public Object onMessage(String id, Object data); /** * Returns a shared thread pool that can be used for background tasks. */ public ExecutorService getThreadPool(); }
- CordovaActivity核心类分析
CordovaActivity是Cordova应用的入口类,用户用来载入html页面的Activity需要继承这个Activity。app
CordovaActivity会读取Cordova配置文件res/xml/config.xml中的配置。框架
CordovaActivity继承了Android Activity,实现了CordovaInterface接口。
比較重要的成员变量有CordovaWebView appView。CordovaWebViewClient webViewClient,用Executors.newCachedThreadPool()初始化了一个线程池threadPool。建立了Activity返回时的回掉插件activityResultCallback,还有就是启动画面splashscreen的一些变量等。CordovaActivity继承了Activity,所以的它的生命周期和Activity同样,咱们可以依照Activity生命周期的顺序開始看代码。
首先看OnCreate方法,首先调用了Config.init(this)方法。读取config.xml文件初始化配置,看Config.java的源代码可以知道,该方法主要初始化了url白名单,背景颜色,是否全屏,载入页面超时时间(默认20s)。启动画面延时(默认3s)等。而后是读取Intent Extra中等一些參数,设置是否显示标题,是否全屏等。
接下来是读取屏幕宽度和高度。建立一个LinearLayoutSoftKeyboardDetect。
LinearLayoutSoftKeyboardDetect这个类是用来检測软键盘是否弹出的。主要是重写了onMeasure方法,当软键盘弹出。高度发生变化时发送 app.appView.sendJavascript(“cordova.fireDocumentEvent(‘hidekeyboard’);")事件。咱们本身的cordova应用在又一次onCreate方法时会依次调用如下的方法。
super.onCreate(savedInstanceState); super.init(); // Set by <content src="index.html" /> in config.xml super.loadUrl(Config.getStartUrl());

onResume方法首先又一次调用了Config.init(this)方法,而后推断是不是第一次启动,假设是则直接返回,不然会调用appView.handleResume方法。该方法会触发javascript事件cordova.fireDocumentEvent(‘resume’),并通知pluginManager,最后进行计数。
onPause方法比較简单,当appView不为空时调用appView.handlePause方法,而后去掉启动画面SplashScreen。
onDestroy。onNewIntent,postMessage。sendJavascript,showWebPage方法的实现也和onPause方法类似,都是调用了appView的相关方法。
方法addService(String serviceType, String className) 用来加入Service,这种方法已经降级了,之后应该在res/xml/plugins.xml文件加入。
startActivityForResult方法首先给回调对象activityResultCallback赋值,设置activityResultKeepRunning,最后调用Activity的startActivityForResult方法。
onActivityResult方法当启动的Activity返回结果时会被调用。首先调用了Activity的onActivityResult方法得到数据。接着调用mUploadMessage.onReceiveValue(result)。最后经过调用activityResultCallback的onActivityResult方法,通知Cordova插件。
onReceivedError方法负责当发生不可恢复的错误时。显示提早定义的出错页面或错误信息。不可恢复的错误是指好比主要资源文件不可用等。
假设配置了错误页面,会在UI线程中止进度条,调用appView.showWebPage方法显示错误页面。不然调用displayError方法弹出错误描写叙述对话框。
onCreateOptionsMenu,onPrepareOptionsMenu,onOptionsItemSelected这几个方法类似。都是先调用postMessage发送相应的事件,而后调用父类Activity的相应方法。
onKeyUp和onKeyDown方法都是先调用appView的相关方法,而后调用Activity的相关方法。
本系列第一篇文章先这样吧。明天下篇文章分析CordovaResourceApi。CordovaWebView。CordovaWebViewClient等几个类。