您好,登錄后才能下訂單哦!
引言
Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式來開 發(fā)移動(dòng)手機(jī)APP,因此當(dāng)頁面需要獲取手機(jī)內(nèi)部某些信息時(shí)(例如:聯(lián)系人信息,坐標(biāo)定位,短信等),程序就需要調(diào)用手機(jī)內(nèi)部的API跟頁面進(jìn)行信息交換。 Cordova 特別為此定制了完善的解決方案,以方便用戶進(jìn)行程序編輯。在這一章里將為大家逐一介紹Cordova與Actitity通訊的實(shí)現(xiàn)原理。
目錄
一、CordovaPlugin類簡介
二、頁面通過 cordova.exec 函數(shù)調(diào)用 CordovaPlugin 插件
三、CordovaInterface接口說明
四、頁面通過CordovaPlugin插件調(diào)用Activity開發(fā)實(shí)例
一、CordovaPlugin類簡介
CordovaPlugin是Cordova插件的父類,用戶自定義的插件必須繼承父類,它的主要常用屬性如下
屬性 | 詳細(xì)說明 |
CordovaWebView | 視圖管理器,當(dāng)中包括PluginManager、CordovaWebViewEngine、ICordovaCookieManager等多個(gè)對(duì)象,用于管理界面渲染,視圖加載過程中的生命周期 |
CordovaInterface | 定義startActivityForResult、setActivityResultCallback等主要方法,獲取調(diào)用上下文中的Activity對(duì)象 |
CordovaPreferences | 用于管理bundle中的屬性值 |
表格1.1
CordovaPlugin的常用方法如下
方法 | 詳細(xì)說明 |
void privateInitialize(String serviceName, CordovaInterface cordova, CordovaWebView webView, CordovaPreferences preferences) | 插件初始化時(shí)執(zhí)行,用于定義service名稱,cordovaInterface接口,CodovaWebView視圖,CordovaPreferences 屬性等值 |
boolean execute(String action, String rawArgs, CallbackContext callbackContext) | 在開發(fā)插件時(shí),用戶的自定義方法,當(dāng)頁面調(diào)用插件時(shí)系統(tǒng)首先將會(huì)運(yùn)行此方法 |
boolean execute(String action, JSONArray args, CallbackContext callbackContext) | 同上 |
boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) | 同上 |
void onActivityResult(int requestCode, int resultCode, Intent intent) | 在開發(fā)插件時(shí),用戶的自定義方法,插件調(diào)用startActivityForResult后的回調(diào)函數(shù)。 |
String getServiceName() | 獲取在config文件中該服務(wù)的名稱 |
Boolean shouldAllowRequest(String url) | 判斷是否允許此請(qǐng)求 |
Boolean shouldAllowNavigation(String url) | 判斷是否允許此導(dǎo)航 |
Boolean shouldOpenExternalUrl(String url) | 判斷是否打開外部鏈接 |
boolean onReceivedHttpAuthRequest(CordovaWebView view, ICordovaHttpAuthHandler handler, String host, String realm) | |
boolean onReceivedClientCertRequest(CordovaWebView view, ICordovaClientCertRequest request) |
表格1.2
CordovaPlugin的詳細(xì)解析可參考官網(wǎng)
http://cordova.apache.org/docs/en/3.4.0/guide_hybrid_plugins_index.md.html#Plugin%20Development%20Guide
回到目錄
二、頁面調(diào)用 CordovaPlugin 插件實(shí)例
大概了解 CordovaPlugin 類的使用方法后,下面為大家介紹一下頁面調(diào)用插件的例子。首先打開文件res/xml/config.xml為插件進(jìn)行配置。
<preference/>可用于運(yùn)行環(huán)境中的常用參數(shù),例如:全屏設(shè)置,滾動(dòng)條設(shè)置,背景色設(shè)置等等
<preference name="Fullscreen" value="true" />
<preference name="DisallowOverscroll" value="true"/>
<preference name="BackgroundColor" value="0xff0000ff"/>
<feature></feature>節(jié)點(diǎn)用于設(shè)置插件描述,feature的name屬性是設(shè)置插件的唯一標(biāo)示,在頁面調(diào)用插件時(shí)將通過name找到此插件
在開發(fā)插件時(shí),先為此插件添加一個(gè)<feature>節(jié)點(diǎn),在<param>中綁定插件的后臺(tái)執(zhí)行文件ShowMessagePlugin.java
<param name="android-package" value="org.apache.cordova.showmessage.ShowMessagePlugin" />
<?xml version='1.0' encoding='utf-8'?> <widget id="com.sun.androidapp" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"> <!--設(shè)置運(yùn)行環(huán)境中的參數(shù)值 --> <preference name="loglevel" value="DEBUG" /> <!-- 插件描述 --> <feature name="Whitelist"> <param name="android-package" value="org.apache.cordova.whitelist.WhitelistPlugin" /> <param name="onload" value="true" /> </feature> <feature name="ShowMessage"> <param name="android-package" value="org.apache.cordova.showmessage.ShowMessagePlugin" /> </feature> <allow-intent href="market:*" /> <!-- 該APP名稱 --> <name>AndroidTest</name> <!-- APP描述 --> <description> A sample Apache Cordova application that responds to the deviceready event. </description> <!-- 作者信息描述 --> <author email="dev@cordova.apache.org" > Apache Cordova Team </author> <!-- 默認(rèn)啟動(dòng)頁面 --> <content src="index.html" /> <!-- 指定app可進(jìn)行通信的域名,*為所有 --> <access origin="*" /> <!-- App默認(rèn)只請(qǐng)?jiān)试S通過手機(jī)端直接打開,若想通過網(wǎng)站,SMS等方式調(diào)用APP,則需要設(shè)置allow-intent配置 --> <allow-intent href="http://*/*" /> <allow-intent href="https://*/*" /> <allow-intent href="tel:*" /> <allow-intent href="sms:*" /> <allow-intent href="mailto:*" /> <allow-intent href="geo:*" /> </widget>
建立org.apache.cordova.showmessage.ShowMessagePlugin類,且繼承CordovaPlugin基類,并實(shí)現(xiàn)
bool execute(action,args,callbackcontext) 方法。當(dāng)頁面調(diào)用此插件時(shí),默認(rèn)執(zhí)行此方法。
action 是唯一標(biāo)識(shí)符,系統(tǒng)可根據(jù)不同的action進(jìn)行不同的操作。
args是頁面?zhèn)魅氲膮?shù),支持String, JsonArray,CordovaArgs 等三種不同的類型。
callbackcontext是系統(tǒng)的上下文,當(dāng)完成操作后調(diào)用callbackcontext.success(支持多類型參數(shù))方法,表示插件操作已完成,并把參數(shù)返還到頁面。最終返回true代表插件執(zhí)行成功,false代表執(zhí)行失敗
package org.apache.cordova.showmessage; public class ShowMessagePlugin extends CordovaPlugin { @Override public boolean execute(String action,JSONArray args,CallbackContext context) throws JSONException{ if(action.equals("mydream")){ String msg=args.getString(0)+"'s dream is to become a "+args.getString(1); context.success(msg); return true; } return false; } }
在 cordova.js 包中,最常用的是 cordova.exec(success,failed,service,action,args)函數(shù),頁面正是通過此函數(shù)調(diào)用插件。
success 用于綁定插件執(zhí)行成功后回調(diào)的回調(diào)函數(shù)
failed用于綁定執(zhí)行失敗的回調(diào)函數(shù)
service與config.xml配置文件中feature字節(jié)的name屬性相對(duì)應(yīng)
action與ShowMessagePlugin對(duì)象boolean excute方法中action參數(shù)對(duì)應(yīng),用于分辨插件執(zhí)行的方法類型,插件可根據(jù)action類型的不同作出分類處理。
args為輸入?yún)?shù)
Name: <input type="text" id="txt1"/> Dream:<input type="text" id="txt2"/> <input type="button" onclick="btnclick()" name="btn" value="Click"/> <br/> <label id="label"></label> <script type="text/javascript"> function btnclick(){ var name=$("#txt1").val(); var dream=$("#txt2").val(); //通過 cordova.exec (success,failed,serviceName,action,args)函數(shù)調(diào)用插件 cordova.exec(success,failed,"ShowMessage","mydream",[name,dream]) } //成功調(diào)用插件,獲取返回值后的頁面處理函數(shù) function success(result){ if(result!=null) $("#label").html(result); else alert("no message"); } //調(diào)用失敗后的處理函數(shù) function failed(msg){ ...... } </script>
測(cè)試結(jié)果
回到目錄
三、CordovaInterface接口說明
CordovaInterface 接口默認(rèn)是由 CordovaInterfaceImpl 類實(shí)現(xiàn)的,當(dāng)中包括了一個(gè)Activity對(duì)象。當(dāng)打開APP時(shí) Cordova 會(huì)默認(rèn)啟動(dòng)此 Activity 以承載 Cordova 核心引擎對(duì)程序進(jìn)行管理。ExecutorService 則負(fù)責(zé)對(duì)象對(duì)線程池進(jìn)行管理,PluginManager則負(fù)責(zé)對(duì)插件進(jìn)行管理,CordovaPlugin則是Cordova插件的父類,所有插件都必須繼承CordovaPlugin。
屬性 | 詳細(xì)說明 |
Activity | 打開APP時(shí) Cordova 會(huì)默認(rèn)啟動(dòng)此 Activity 以承載 Cordova 核心引擎對(duì)程序進(jìn)行管理 |
ExecutorService | 對(duì)線程池進(jìn)行管理 |
PluginManager | 插件管理器,用于管理插件的生成,運(yùn)行,結(jié)束等生命周期 |
CordovaPlugin | 通過startActivityForResult方法綁定CordovaPlugin插件 |
ActivityResultHolder | 內(nèi)部類,封裝了requestCode, resultCode, intent等對(duì)象 |
表格2.1
CordovaInterfaceImpl定義了三個(gè)最常用方法
方法 | 詳細(xì)說明 |
void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) | 綁定CordovaPlugin參數(shù),并調(diào)用Activity對(duì)象的startActivityForResult(intent, requestCode)方法,根據(jù) intent 綁定值跳轉(zhuǎn)到對(duì)應(yīng)的activity |
void setActivityResultCallback(CordovaPlugin plugin) | 激發(fā)CordovaPlugin對(duì)象的onActivityResult事件 |
boolean onActivityResult(int requestCode, int resultCode, Intent intent) | 封裝Acticity對(duì)象的onActivityResult回調(diào)函數(shù), 激發(fā)CordovaPlugin對(duì)象的onActivityResult事件 |
表格2.2
回到目錄
四、頁面通過CordovaPlugin插件調(diào)用Activity開發(fā)實(shí)例
類似于第一節(jié)實(shí)例,在頁面通過cordova.exec(success,failed,service,action,args)方法調(diào)用插件,返回時(shí)調(diào)用success函數(shù)進(jìn)行處理顯示結(jié)果
出游省份: <select id="select1"> <option value='1' selected='selected'>黑龍江</option> <option value='2'>吉林</option> <option value='3'>遼寧</option> </select> <input type="button" onclick="btnclick()" name="btn" value="查找"/> <br/> 路線景點(diǎn): <label id="label"></label><br/> <script type="text/javascript"> function btnclick(){ var province=$("#select1").val(); //通過 cordova.exec (success,failed,serviceName,actionName,args)函數(shù)調(diào)用插件 cordova.exec(success,null,"ShowMessage","showMessage",[province]); } //成功調(diào)用插件,獲取返回值后的頁面處理函數(shù) function success(result){ if(result!=null) $("#label").html(result); else alert("no message"); } </script>
插 件通過判斷action參數(shù)判斷進(jìn)行不同的處理,然后通過Intent對(duì)象綁定將要啟動(dòng)的Activity,最后通過CordovaInterface中 的startActivityForResult(cordovaPlugin,intent,int)方法啟動(dòng)該Activity。當(dāng) Activity 結(jié)束后,系統(tǒng)將調(diào)用回調(diào)函數(shù) onActivityResult(int requestCode, int resultCode, Intent intent)
在此說明一下Intent類的用途,此類主要用于綁定當(dāng)前的活動(dòng)與子活動(dòng)之間關(guān)系,當(dāng)中包含6種構(gòu)造函數(shù)。
1、Intent() 空構(gòu)造函數(shù)
2、Intent(Intent o) 拷貝構(gòu)造函數(shù)
3、Intent(String action) 指定action類型的構(gòu)造函數(shù)
4、Intent(String action, Uri uri) 指定Action類型和Uri的構(gòu)造函數(shù),URI主要是結(jié)合程序之間的數(shù)據(jù)共享ContentProvider
5、Intent(Context packageContext, Class<?> cls) 傳入組件的構(gòu)造函數(shù),也就是此例子中使用到的
6、Intent(String action, Uri uri, Context packageContext, Class<?> cls) 前兩種結(jié)合體
Intent 類中封裝了一個(gè)Bundle 對(duì)象 mExtras,可用于主活動(dòng)與子活動(dòng)之間傳值,系統(tǒng)可通過 putExtra 方法把參數(shù)傳入mExtras, 也可通過 getShortExtra、getIntExtra、getBooleanExtra、getByteExtra 等多個(gè)方法從mExtras 獲取參數(shù)值。
public class ShowMessagePlugin extends CordovaPlugin { private CallbackContext context; @Override public boolean execute(String action,JSONArray args,CallbackContext context) throws JSONException{ this.context=context; //根據(jù)action判斷調(diào)用方法 if(action.equals("showMessage")){ //通過Intent綁定將要調(diào)用的Activity Intent intent=new Intent(this.cordova.getActivity(),SpotActivity.class); //加入將要傳輸?shù)絘ctivity中的參數(shù) intent.putExtra("province", args.getString(0)); //啟動(dòng)activity this.cordova.startActivityForResult(this, intent, 0); } return true; } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { // 根據(jù)resultCode判斷處理結(jié)果 if(resultCode==Activity.RESULT_OK){ String spot=intent.getStringExtra("spot"); context.success(spot); } } }
Activity 被觸發(fā)后先通過 setContentView 方法綁定視圖,再從intent 對(duì)象中獲取輸入?yún)?shù)進(jìn)行處理。
完成操作后,通過 Activity 類 setResult(int resultCode, Intent data) 方法綁定返回值,其中resultCode可被 cordovaPlugin 插件用作判斷返回值的處理結(jié)果。
最后調(diào)用 Activity 對(duì)象的 finish 方法關(guān)閉 SpotActivity,把返回值回傳到 CordovaPlugin。
public class SpotActivity extends Activity{ private CheckBox chk1,chk2,chk3; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //綁定視圖 setContentView(R.layout.goods_list); //從intent中獲取輸入?yún)?shù) Integer province=Integer.parseInt(this.getIntent().getStringExtra("province")); setSpots(province); } private void setSpots(Integer n){ this.chk1=(CheckBox)this.findViewById(R.id.checkBox1); this.chk2=(CheckBox)this.findViewById(R.id.checkBox2); this.chk3=(CheckBox)this.findViewById(R.id.checkBox3); switch(n){ case 1: chk1.setText("漠河"); chk2.setText("北極村"); chk3.setText("九曲十八灣"); break; case 2: chk1.setText("長白山"); chk2.setText("霧凇島"); chk3.setText("朝鮮自治州"); break; case 3: chk1.setText("鴨綠江"); chk2.setText("筆架山"); chk3.setText("鳳凰山"); break; default: break; } } public void btn_onClick(View view){ String spot=""; if(chk1.isChecked()) spot+=chk1.getText(); if(chk2.isChecked()) spot+=" "+chk2.getText(); if(chk3.isChecked()) spot+=" "+chk3.getText(); //通過setResult綁定返回值 Intent intent=new Intent(); intent.putExtra("spot",spot); setResult(RESULT_OK,intent); //關(guān)閉該activity,把返回值傳回到cordovaPlugin插件 this.finish(); } }
Activity 視圖
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="選擇景點(diǎn)" android:layout_marginTop="80dp"/> <CheckBox android:id="@+id/checkBox1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <CheckBox android:id="@+id/checkBox2" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <CheckBox android:id="@+id/checkBox3" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="40dp" android:text="確認(rèn)" android:layout_marginTop="20dp" android:onClick="btn_onClick"/> </LinearLayout>
activity 關(guān)閉后,cordovaPlugin 插件將 調(diào)用回調(diào)函數(shù) onActivityResult(int requestCode, int resultCode, Intent intent),回調(diào)函數(shù)中可根據(jù) resultCode 參數(shù)判斷處理情況,根據(jù)不同的結(jié)果對(duì)intent 中的返回值 bundler 對(duì)象進(jìn)行不同處理。 最后使用 callbackContext 對(duì)象中的 success(string) 方法把處理結(jié)果回傳到頁面;
處理結(jié)果:
回到目錄
本章小結(jié)
Cordova(PhoneGap) 技術(shù)使用了CordovaPlugin 插件化(模塊化)技術(shù),使用不同插件對(duì)不同HTML5頁面進(jìn)行分別處理。與此同時(shí),系統(tǒng)也可以利用插件調(diào)用系統(tǒng)已有的地圖、通信錄、瀏覽器等多個(gè)API, 與 HTML5 頁面進(jìn)行信息交換,真正實(shí)現(xiàn)HTML5與Android、iOS系統(tǒng)的無縫對(duì)接。
參考文章
Cordova(PhoneGap)通過CordovaPlugin插件調(diào)用 Activity 實(shí)例
最新版Cordova 5.1.1(PhoneGap)搭建開發(fā)環(huán)境
Apache2.2+Tomcat7.0整合配置詳解
Windows Server 2008 R2 負(fù)載平衡入門篇
作者:風(fēng)塵浪子
http://www.cnblogs.com/leslies2/p/cordovaPlugin.html
原創(chuàng)作品,轉(zhuǎn)載時(shí)請(qǐng)注明作者及出處
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。