溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Cordova(PhoneGap)通過CordovaPlugin插件調(diào)用 Activity 實(shí)例

發(fā)布時(shí)間:2020-03-31 23:21:01 來源:網(wǎng)絡(luò) 閱讀:1317 作者:leslies2 欄目:移動(dòng)開發(fā)

引言

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"/>&nbsp;&nbsp;&nbsp;&nbsp;
       Dream:<input type="text" id="txt2"/>&nbsp;&nbsp;&nbsp;&nbsp;
       <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é)果

Cordova(PhoneGap)通過CordovaPlugin插件調(diào)用 Activity 實(shí)例

回到目錄

 

三、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>

Cordova(PhoneGap)通過CordovaPlugin插件調(diào)用 Activity 實(shí)例

插 件通過判斷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>

Cordova(PhoneGap)通過CordovaPlugin插件調(diào)用 Activity 實(shí)例

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é)果:

Cordova(PhoneGap)通過CordovaPlugin插件調(diào)用 Activity 實(shí)例

回到目錄

本章小結(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)注明作者及出處


向AI問一下細(xì)節(jié)

免責(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)容。

AI