±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ¸öÈ˲©¿Í,±¾ÎÄÖ÷Òª½²ÊöÈçºÎͨ¹ý¿çƽ̨¿ª·¢µÄ·½·¨Ê¹ÓÃCordova¿ò¼Ü¿ª·¢¡£ |
|
Ŀ¼
1.ΪºÎÒªÓÃCordova
2.ʲôÊÇCordova
3.CordovaÖÐUMLÀàͼ
4.CordovaʵÏÖ»úÖÆ
5..С½á
ΪºÎÒªÓÃCordova
Ëæ×ÅÒÆ¶¯»¥ÁªÍøµÄ·¢Õ¹£¬ÏÖÔÚ»ù±¾ÊÇAPPÂúÌì·É£¬²»ÖªÔÚ´ó¼ÒÓ¡ÏóÖУ¬Èç¹ûÎÒÈ¥ÏÂÔØÒ»¸öAPP£¬ÄÇô»ù±¾¶¼ÄÜ¿´µ½ÓÐÁ½ÖÖÑ¡Ôñ£¬Ò»ÖÖÊÇAndroid°æ±¾£¬Ò»ÖÖÊÇIOS°æ±¾¡£²»¹ÜÎÒµÄÊÖ»úÊÇÄÄÖÖ²Ù×÷ϵͳ£¬°²×°ÍêÒ»¸öAPPÖ®ºó£¬ºóÐøÈç¹ûÓÐеİ汾·¢²¼µÄʱºò£¬ÎÒ»¹±ØÐëÈ¥¸üУ¬²ÅÄÜÏíÓÃа汾ÀïµÄ¹¦ÄÜ£¬±ÈÈçÎÒ×°ÁË¡°¾©¶«¡±Õâ¸öAPP£¬Ç°¼¸ÌìÕýºÃÅöµ½¡°618¡±»î¶¯£¬ÄÇô֮ǰһ¸öÔÂAPP
Store¾ÍÌáÐÑÎÒҪȥ¸üÐÂ×îеÄAPP°æ±¾£¬ÒÔÃâ´í¹ý¡°618¡±»î¶¯ÖÐÐµĹ¦ÄÜʹÓá£Ïà¶ÔÀ´ËµIOSϵͳ¸üÐÂAPP±ÈÆðAndroidϵͳÓû§ÌåÑé»áºÃÒ»µã£¬µ«ÊÇ»¹ÊÇÉÔÏÔÂé·³µã¡£
ÄÇôÓÐûÓÐÒ»ÖÖ·½Ê½£¬ÎÒÖ»ÐèÒª¿ª·¢Ò»¸öAPP°æ±¾£¬¾ÍÄÜÈ¥ÊÊÅäͨÓõIJÙ×÷ÏµÍ³ÄØ£¬²»½ö¿ÉÒÔÊÊÅäAndroid¡¢IOS£¬»¹¿ÉÒÔÊÊÅäÆäËûϵͳ£¬±ÈÈçWindows
Phone¡¢ Palm WebOS¡¢BlackberryµÈµÈ¡£ÓУ¬Cordova¾ÍÄÜÌṩÕâÖÖÄÜÁ¦£¬´úÂëдһ´Î£¬¾ÍÄܵ½´¦ÔËÐУ¬¸úÎÒÃÇÈÕ³£¿ª·¢ÍøÕ¾Ð§¹ûÒ»Ñù£¬»ùÓÚдWeb
APP£¬¸ù¾ÝÊä³öƽ̨ҪÇó²»Í¬£¬¾ÍÄÜÌṩ²»Í¬ÀàÐ͵ݲװ°ü¡£CordovaÆäÉè¼Æ³õÖÔÊÇÏ£ÍûÓû§ÈºÌåÄܹ»Í¨¹ý¿çƽ̨¿ª·¢µÄ·½·¨½µµÍÔÉú¿ª·¢µÄ³É±¾£¬Îª´Ë£¬¿ª·¢ÈËÔ±ÐèÒª°²×°ÔÉú¿ª·¢»·¾³£¬ÅäÖù¤³Ì£¬Ê¹ÓÃHTML5¡¢CSS3¡¢JSºÍÔÉúSDKÉú³ÉÓ¦Óá£
ʲôÊÇCordova
¹ÙÍø¶¨ÒåÈçÏ£º
Apache CordovaÊÇÒ»¸ö¿ªÔ´µÄÒÆ¶¯¿ª·¢¿ò¼Ü¡£ÔÊÐíÄãÓñê×¼µÄweb¼¼Êõ-HTML5,CSS3ºÍJavaScript×ö¿çƽ̨¿ª·¢¡£
Ó¦ÓÃÔÚÿ¸öƽ̨µÄ¾ßÌåÖ´Ðб»·â×°ÁËÆðÀ´£¬²¢ÒÀ¿¿·ûºÏ±ê×¼µÄAPI°ó¶¨È¥·ÃÎÊÿ¸öÉ豸µÄ¹¦ÄÜ£¬±ÈÈç˵£º´«¸ÐÆ÷¡¢Êý¾Ý¡¢ÍøÂç״̬µÈ¡£
ʹÓÃApache CordovaµÄÈËȺ:
1.ÒÆ¶¯Ó¦Óÿª·¢Õߣ¬ÏëÀ©Õ¹Ò»¸öÓ¦ÓõÄʹÓÃÆ½Ì¨£¬¶ø²»Í¨¹ýÿ¸öƽ̨µÄÓïÑԺ͹¤¾ß¼¯ÖØÐÂʵÏÖ¡£
2.web¿ª·¢Õߣ¬Ïë°ü×°²¿Êð×Ô¼ºµÄweb App½«Æä·Ö·¢µ½¸÷¸öÓ¦ÓÃÉ̵êÃÅ»§¡£
3.ÒÆ¶¯Ó¦Óÿª·¢Õߣ¬ÓÐÐËȤ»ìºÏÔÉúÓ¦ÓÃ×齨ºÍÒ»¸öWebView(Ò»¸öÌØ±ðµÄä¯ÀÀÆ÷´°¿Ú)
¿ÉÒÔ½Ó´¥É豸A¼¶PI£¬»òÕßÄãÏ뿪·¢Ò»¸öÔÉúºÍWebView×é¼þÖ®¼äµÄ²å¼þ½Ó¿Ú¡£

´ÓͼÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½ËüÌṩÁËWeb APP¡¢WebView¡¢Cordova Plugins¡£
Web APP
ÕâÊÇ´æ·ÅÓ¦ÓóÌÐò´úÂëµÄµØ·½£¬ÌåÏÖÊÇÄãµÄ¾ßÌåÒµÎñÂ߼ģ¿é¡£Ó¦ÓõÄʵÏÖÊÇͨ¹ýwebÒ³Ãæ£¬Ä¬Èϵı¾µØÎļþÃû³ÆÊÇÊÇindex.html£¬Õâ¸ö±¾µØÎļþÓ¦ÓÃCSS,JavaScript,ͼƬ£¬Ã½ÌåÎļþºÍÆäËûÔËÐÐÐèÒªµÄ×ÊÔ´¡£Ó¦ÓÃÖ´ÐÐÔÚÔÉúÓ¦Óðü×°µÄWebViewÖУ¬Õâ¸öÔÉúÓ¦ÓÃÊÇÄã·Ö·¢µ½app
storesÖеġ£
WebView
CordovaÆôÓõÄWebView¿ÉÒÔ¸øÓ¦ÓÃÌṩÍêÕûÓû§·ÃÎʽçÃæ¡£ÔÚһЩƽ̨ÖУ¬ËûÒ²¿ÉÒÔ×÷Ϊһ¸ö×é¼þ¸ø´óµÄ¡¢»ìºÏÓ¦Óã¬ÕâЩӦÓûìºÏºÍWebviewºÍÔÉúµÄÓ¦ÓÃ×é¼þ¡£
Cordova Plugins
²å¼þÊÇCordovaÉú̬ϵͳµÄÖØÒª×é³É²¿·Ö¡£ËûÌṩÁËCordovaºÍÔÉú×é¼þÏ໥ͨÐŵĽӿڲ¢°ó¶¨µ½Á˱ê×¼µÄÉ豸APIÉÏ£¬ÕâʹÄãÄܹ»Í¨¹ýJavaScriptµ÷ÓÃÔÉú´úÂë¡£
CordovaÖÐUMLÀàͼ
ÆäʵCordovaͨ¹ýÃüÁîÀ´Ìí¼ÓÏîÄ¿µÄ£¬µ«ÊÇ¿ÉÒÔÑ¡ÔñÄĸöƽ̨ȥ±àÒ룬±ÈÈçÎÒÃÇÌí¼ÓAndroidƽ̨£¬ÔÚAndroidĬÈÏmainActivityÀ࣬ÎÒÃÇ¿ÉÒÔ¿´µ½ËüÆäʵ¼Ì³ÐCordovaActivityÀ࣬һÇгõʼ»¯Ìõ¼þÊÇ´ÓloadUrl·½·¨¿ªÊ¼¡£
package
com.example.hello;
import android.os.Bundle;
import org.apache.cordova.*;
public class MainActivity extends CordovaActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// enable Cordova apps to be started in the
background
Bundle extras = getIntent().getExtras();
if (extras != null && extras.getBoolean("cdvStartInBackground",
false)) {
moveTaskToBack(true);
}
// Set by <content src="index.html"
/> in config.xml
loadUrl(launchUrl);
}
} |
½ø¶øµÃµ½ÒÔÏÂUMLÀàͼ

¼òµ¥·ÖÎöÏ£¬CordovaActivityÄÚÒÀÀµÒ»¸öWebViewÀ࣬һ¸öPreferencesÀ࣬һ¸öCordovaInterface½Ó¿Ú£¬²¢Í¬Ê±³õʼ»¯Ò»Ð©ÅäÖÃÐÅÏ¢¡£WebView¾ßÌåʵÏÖÊÇÓÉCordovaWebViewImplÀ࣬CordovaInterface½Ó¿Ú¾ßÌåʵÏÖÊÇÓÉCordovaInterfaceImplÀàʵÏÖ¡£
CordovaWebViewImplÊǺËÐÄÀ࣬ÀïÃæ»á°ÑһЩ²å¼þÄÜÁ¦³õʼ»¯£¬ÓÃÒ»¸öPluginManager½øÐйÜÀí£¬°üº¬Ò»¸öÒýÇæÀࡪCordovaWebViewEngine£¬Õâ¸öÒýÇæÊÇͨ¹ý·´ÉäµÄ·½Ê½´´½¨£¬×ÔÉí³õʼ»¯µÄʱºò°ÑNativeToJsMessageQueue¹ØÁªÆðÀ´£¬ÀïÃæ°üº¬×ÅÒÔJs×Ö·û´®ÎªÖ÷µÄË«ÏòÁ´±í£¬°Ñÿ´Î´Óǰ¶Ëͨ¹ýJS´úÂë´æ´¢ÆðÀ´£¬È»ºóͨ¹ý°ó¶¨µÄÇŽӷ½Ê½Pop³öµ½ÏàÓ¦µÄNative´úÂëÖÐÈ¥¡£
×îÖÕʵÏÖÓÉSystemWebViewEngineÀàÀ´¶ÔAndroidϵͳÖÐWebView¿Ø¼þ½øÐжþ´Î°ü×°£¬Õâ¸öÀàµÄ³õʼ»¯ÊÇÔÚCordovaWebViewImplÀà·´Éä´´½¨£¬Ïà¹Ø²å¼þºÍÏûÏ¢´«µÝÒ²ÊÇͨ¹ýSystemWebViewEngine½øÐа󶨡£
CordovaʵÏÖ»úÖÆ
µ±Cordova¿ò¼ÜÆô¶¯Ê±ºò£¬CordovaActivityÀàÖеÄonCreate·½·¨µ÷ÓÃloadUrl·½·¨¼´¿ÉÆô¶¯£¬×îÖÕÔÚSystemWebViewEngineÀàµÄinit·½·¨ÖУ¬»áµ÷ÓÃwebViewµÄaddJavascriptInterface·½·¨£¬¿´µ½Õâ¸ö·½·¨ÊDz»ÊǺÜÊìϤ£¬ÎÒÃdz£¹æÈÃwebViewÖ§³Ö¿ªÆôJavaScriptµ÷ÓýӿÚÒ²ÊÇʹÓôËÌØÐÔ¡£
private static void exposeJsInterface(WebView
webView, CordovaBridge bridge) {
if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1))
{
LOG.i(TAG, "Disabled addJavascriptInterface()
bridge since Android version is old.");
// 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.
return;
}
SystemExposedJsApi exposedJsApi = new SystemExposedJsApi(bridge);
webView.addJavascriptInterface(exposedJsApi,
"_cordovaNative");
} |
ÄÇôSystemExposedJsApiÀànew³öÀ´µÄ¶ÔÏó¾ÍµÈͬÅ׳ö¡°_cordovaNative¡±¶ÔÏó¸øJS¶Ëµ÷Ó㬽øÈ¥¿´ÏÂSystemExposedJsApiÀà°üº¬ÄÄЩÄÚÈÝ£¬
class
SystemExposedJsApi implements ExposedJsApi {
private final CordovaBridge bridge;
SystemExposedJsApi(CordovaBridge bridge) {
this.bridge = bridge;
}
@JavascriptInterface
public String exec(int bridgeSecret, String
service, String action, String callbackId, String
arguments) throws JSONException, IllegalAccessException
{
return bridge.jsExec(bridgeSecret, service,
action, callbackId, arguments);
}
@JavascriptInterface
public void setNativeToJsBridgeMode(int bridgeSecret,
int value) throws IllegalAccessException {
bridge.jsSetNativeToJsBridgeMode(bridgeSecret,
value);
}
@JavascriptInterface
public String retrieveJsMessages(int bridgeSecret,
boolean fromOnlineEvent) throws IllegalAccessException
{
return bridge.jsRetrieveJsMessages(bridgeSecret,
fromOnlineEvent);
}
} |
ÆäÖÐ×î¹Ø¼üÊÇexec·½·¨£¬ÆäÖÐbridgeSecret´ú±íÑ¡ÔñÄĸöÇŽӷ½Ê½£¬serviceÒ»°ã¶ÔÓ¦×ÅÄã±¾µØJavaÎļþÀàÃû£¬action´ú±íjavaÎļþÖз½·¨Ãû£¬callbackId´ú±í»Øµ÷º¯ÊýµÄId£¬Ò²¾ÍÊǾä±ú£¬arguments´ú±í´«µÝµÄ²ÎÊý¡£¿´³öÆäÖÐÉè¼ÆË¼ÏëÁËû£¬serviceÍùÍùÊDZ¾µØÄÜÁ¦¼¯µÄÀàÃû£¬±ÈÈçweb¶ËÏëµ÷ÓÃÏà»ú£¬Ò»°ãÆð¸öCameraÀà´ú±íÕâ¸öÏà»ú·þÎñÀ࣬ȻºóÔÚÕâ¸öÀàÖж¨Òå·½·¨£¬Ò²¾ÍÊÇaction²ÎÊý£¬Õâ¸öactionÃû³Æ¿ÉÀ©Õ¹£¬ÒòΪ·½·¨Ãû³Æ¿É¸÷ÖÖ¸÷Ñù£¬ÊʺÏ×Ô¶¨Ò幦ÄÜÀ©Õ¹¡£
SystemExposedJsApi¶ÔÏó³õʼ»¯
ÔÚ´´½¨SystemExposedJsApiʱÐèÒªCordovaBridgeÀ࣬CordovaBridgeÀà³õʼ»¯ÐèÒªCordovaWebViewµÄPluginManager¶ÔÏóºÍNativeToJsMessageQueue¶ÔÏó¡£ÒòΪËùÓеÄJS¶ËÓëAndroid
native´úÂë½»»¥¶¼ÊÇͨ¹ýSystemExposedJsApi¶ÔÏóµÄexec·½·¨¡£ÔÚexec·½·¨ÖÐÖ´ÐÐPluginManagerµÄexec·½·¨£¬PluginManagerÈ¥²éÕÒ¾ßÌåµÄPlugin²¢ÊµÀý»¯È»ºóÔÙÖ´ÐÐPluginµÄexecute·½·¨£¬²¢¸ù¾Ýͬ²½±êʶÅжÏÊÇͬ²½·µ»Ø¸øJSÏûÏ¢»¹ÊÇÒì²½¡£ÓÉNativeToJsMessageQueueͳһ¹ÜÀí·µ»Ø¸øJSµÄÏûÏ¢¡£
ºÎʱ¼ÓÔØPlugin£¬ÈçºÎ¼ÓÔØ
CordovaÖкÜÖØÒªµÄ²¿·ÖÊDzå¼þ£¬CordovaÔÚÆô¶¯Ã¿¸öActivityµÄʱºò¶¼»á½«ÅäÖÃÎļþÖеÄËùÓÐplugin¼ÓÔØµ½PluginManager£¬ÔÚµÚÒ»´ÎloadUrl·½·¨Ê±£¬¾Í»áÈ¥³õʼ»¯PluginManager²¢¼ÓÔØplugin£¬PluginManager
ÔÚ¼ÓÔØ plugin µÄʱºò²¢²»ÊÇÂíÉÏʵÀý»¯plugin¶ÔÏ󣬶øÊÇÖ»Êǽ«pluginµÄClassÃû×Ö±£´æµ½Ò»¸öhashmapÖУ¬ÓÃserviceÃû×Ö×÷ΪkeyÖµ¡£µ±JS¶Ëͨ¹ýJavascriptInterface½Ó¿ÚµÄ
SystemExposedJsApi ¶ÔÏóÇëÇóAndroidʱ£¬PluginManager »á´Ó hashmap
ÖвéÕÒµ½ plugin £¬Èç¹û¸Ãplugin»¹Î´ÊµÀý»¯£¬ÀûÓÃjava·´Éä»úÖÆÊµÀý»¯¸Ãplugin£¬²¢Ö´ÐÐpluginµÄexecute·½·¨¡£
CordovaµÄÊý¾Ý·µ»Ø
CordovaÖÐͨ¹ýexec()º¯ÊýÇëÇóandroid²å¼þ£¬Êý¾ÝµÄ·µ»Ø¿Éͬ²½Ò²¿ÉÒÔÒì²½ÓÚexec()º¯ÊýµÄÇëÇó¡£ÔÚ¿ª·¢android²å¼þµÄʱºò¿ÉÒÔÖØÐ´
public boolean isSynch(String action) ·½·¨À´¾ö¶¨ÊÇͬ²½»¹ÊÇÒì²½¡£CordovaÔÚandroid¶ËʹÓÃÁËÒ»¸ö¶ÓÁÐ
(NativeToJsMessageQueue) À´×¨ÃŹÜÀí·µ»Ø¸øJSµÄÊý¾Ý¡£
1£¬Í¬²½
CordovaÔÚÖ´ÐÐÍêexec()ºó£¬android»áÂíÉÏ·µ»ØÊý¾Ý£¬µ«²»Ò»¶¨¾ÍÊǸôÎÇëÇóµÄÊý¾Ý£¬¿ÉÄÜÊÇÇ°ÃæÄ³´ÎÇëÇóµÄÊý¾Ý£»ÒòΪµ±exec()ÇëÇóµÄ²å¼þÊÇÔÊÐíͬ²½·µ»ØÊý¾ÝµÄÇé¿öÏ£¬CordovaÒ²ÊÇ´ÓNativeToJsMessageQueue¶ÓÁÐÍ·popÍ·Êý¾Ý²¢·µ»Ø¡£È»ºóÔÙ¸ù¾Ý
callbackID ·´Ïò²éÕÒij¸öJSÇëÇ󣬲¢½«Êý¾Ý·µ»Ø¸ø¸ÃÇëÇóµÄsuccessº¯Êý¡£
2£¬Òì²½
CordovaÔÚÖ´ÐÐÍêexec()ºó²¢²»»áͬ²½µÃµ½Ò»¸ö·µ»ØÊý¾Ý¡£CordovaÔÚÖ´ÐÐexec()µÄͬʱÆô¶¯ÁËÒ»¸öXMLHttpRequest¶ÔÏó·½Ê½»òÕßprompt()º¯Êý·½Ê½µÄÑ»·º¯ÊýÀ´²»Í£µÄÈ¥»ñÈ¡NativeToJsMessageQueue¶ÓÁÐÖеÄÊý¾Ý£¬²¢¸ù¾Ý
callbackID ·´Ïò²éÕÒµ½Ïà¶ÔÓ¦µÄJSÇëÇ󣬲¢½«¸ÃÊý¾Ý½»¸øsuccessº¯Êý¡£
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 µ÷ÓÃ
С½á
×ܵÄÀ´Ëµ£¬Ê¹Óà Cordova ¿ò¼Ü¿ª·¢ÓÅȱµãºÜÃ÷ÏÔ¡£
Óŵ㣺
1.¿çƽ̨£¬¿ª·¢¼òµ¥£¬Ñ§Ï°³É±¾µÍ
2.¿ò¼Ü¶à£¬²å¼þ¶à£¬¿É×Ô¶¨Òå²å¼þ
3.·¢Õ¹×îÔ磬ÉçÇø×ÊÔ´·á¸»£¬
ȱµã£º
1.WebViewÐÔÄܵÍÏÂʱ£¬Óû§ÌåÑé²î£¬·´Ó¦Âý
2.±Ï¾¹ÊÇÀÏÍâµÄ¿ò¼Ü£¬ÖÐÎÄÎĵµ×ÊÔ´ÉÙ
3.µ÷ÊÔ²»·½±ã£¬¼È²»ÏñÔÉúÄÇôºÃµ÷ÊÔ£¬Ò²²»Ïñ´¿webÄÇÖÖµ÷ÊÔ
×îºóÏë˵һ¾ä£¬ÎÞÂÛÊÇÑ¡ÔñÔÉúģʽ¿ª·¢»¹ÊÇHybrid»ìºÏģʽ£¬Ò»¶¨ÊÇÒª»ùÓÚ¾ßÌåÒµÎñ³¡¾°È¥Ñ¡Ôñ£¬¶ø²»ÊÇäĿºÍ¾ø¶Ô»¯¾õµÃÄÄÖÖģʽºÃ¾Í²»×ö·ÖÎöÏ뵱ȻµÄȥѡÔñ£¬»¹ÊÇÓÐÑ¡ÔñµÄ½áºÏ£¬ÒªÖªµÀÓ¦ÓÃÖ®ÃÀÔÚÓÚÒ©µ½²¡³ý¡£ |