移動平臺上JavaScript調(diào)用原生功能的方法以及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及移動互聯(lián)網(wǎng)技術(shù)領(lǐng)域,尤其涉及一種移動平臺上JavaScript調(diào)用原生功能的方法以及系統(tǒng)。
【背景技術(shù)】
[0002]在開發(fā)移動應(yīng)用時,會用到webview控件(瀏覽器控件)進(jìn)行加載網(wǎng)頁展示進(jìn)行交互,會出現(xiàn)javascript調(diào)用native code(原生功能)或者native code調(diào)用javascript的情況。通常做法是利用原生API進(jìn)行操作。參考圖1,javascript位于前端邏輯層,native code是屬于底層原生層,其中,javascript調(diào)用native code的具體方法是,WebKit的原生API暴露一個native code的對象給js,即圖中所示意的原生層開放的javascript接口,使得javascript可以通過這個javascript接口直接調(diào)用native code。這種方法對效率不高,不能異步操作,特別是對于執(zhí)行時間較長的js操作,會產(chǎn)生阻塞,調(diào)用起來不統(tǒng)一,方法多了管理代碼會混亂,不利于工程的后期維護(hù)與擴張。
【發(fā)明內(nèi)容】
[0003]本發(fā)明要解決的技術(shù)問題在于,針對現(xiàn)有技術(shù)的上述缺陷,提供一種移動平臺上JavaScript調(diào)用原生功能的方法以及系統(tǒng)。
[0004]本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:構(gòu)造一種移動平臺上JavaScript調(diào)用原生功能的方法,所述方法包括:
[0005]SI JavaScript在調(diào)用原生功能時觸發(fā)瀏覽器控件中的經(jīng)過重寫的提示對話框方法,所述JavaScript在網(wǎng)頁加載時啟動輪詢以不斷地觸發(fā)所述提示對話框方法;
[0006]S2、經(jīng)過重寫的提示對話框方法在觸發(fā)后,首先對其參數(shù)進(jìn)行解析,如果根據(jù)解析結(jié)果判斷執(zhí)行原生功能,則繼續(xù)對參數(shù)進(jìn)行解析以獲取功能組件信息和調(diào)用方式,再執(zhí)行步驟S3并結(jié)束;如果根據(jù)解析結(jié)果判斷查找消息隊列則執(zhí)行步驟S4并結(jié)束;
[0007]S3、根據(jù)開放的JavaScript接口實現(xiàn)原生功能的調(diào)用,如果調(diào)用方式為異步調(diào)用,則實例化新線程,在新線程中根據(jù)所述功能組件信息調(diào)用對應(yīng)的功能組件,啟動新線程后主線程原路返回,所述新線程在完成后把結(jié)果放入消息隊列中;如果調(diào)用方式為同步調(diào)用,則在主線程中根據(jù)所述功能組件信息調(diào)用對應(yīng)的功能組件,并在調(diào)用完畢后將執(zhí)行結(jié)果原路返回;
[0008]S4、根據(jù)開放的JavaScript接口實現(xiàn)從所述消息隊列中檢索結(jié)果。
[0009]在本發(fā)明所述的移動平臺上JavaScript調(diào)用原生功能的方法中,所述步驟S2包括:
[0010]S21、如果提示對話框方法判斷出默認(rèn)字符串參數(shù)的前綴與預(yù)設(shè)的表示執(zhí)行原生功能的字符串相同,則根據(jù)默認(rèn)字符串參數(shù)的位于前綴后面的字符串獲取以下參數(shù)數(shù)據(jù):與功能組件唯一對應(yīng)的組件ID、與返回結(jié)果唯一對應(yīng)的Callbackld、調(diào)用方式以及其他參數(shù),再執(zhí)行步驟S3并結(jié)束;
[0011]S22、如果提示對話框方法判斷默認(rèn)字符串參數(shù)的前綴與預(yù)設(shè)的表示查找消息隊列的字符串相同,則根據(jù)默認(rèn)字符串參數(shù)的位于前綴后面的字符串獲取與返回結(jié)果唯一對應(yīng)的Cal lbackld,再執(zhí)行S4并結(jié)束;
[0012]S23、如果前綴不屬于以上的兩種情況,則執(zhí)行默認(rèn)的操作,彈出提示對話框。
[0013]在本發(fā)明所述的移動平臺上JavaScript調(diào)用原生功能的方法中,所述步驟S3包括:
[0014]S31、將S21中獲取的參數(shù)數(shù)據(jù)發(fā)送給瀏覽器控件中的具有JavaScript接口的原生對象中的原生功能調(diào)用方法,原生對象再把參數(shù)數(shù)據(jù)發(fā)送給組件管理類的原生功能調(diào)用方法,組件管理類中的原生功能調(diào)用方法在判斷調(diào)用方式為異步調(diào)用時,執(zhí)行步驟S32并結(jié)束,在判斷調(diào)用方式為同步調(diào)用時,執(zhí)行步驟S33并結(jié)束;
[0015]S32、實例化新線程,在新線程中根據(jù)組件ID調(diào)用對應(yīng)的功能組件,啟動新線程后主線程原路返回,所述新線程在完成后把執(zhí)行結(jié)果與Callbackld綁定后放入消息隊列中;
[0016]S33、在主線程中根據(jù)組件ID調(diào)用對應(yīng)的功能組件,并在調(diào)用完畢后將執(zhí)行結(jié)果原路返回;
[0017]S34、將S22中獲取的Callbackld發(fā)送給瀏覽器控件中的具有JavaScript接口的原生對象中的接收J(rèn)S消息方法,接收J(rèn)S消息方法根據(jù)Cal lbackld從消息隊列中查詢結(jié)果,并在有對應(yīng)的結(jié)果時將結(jié)果原路返回到網(wǎng)頁中。
[0018]在本發(fā)明所述的移動平臺上JavaScript調(diào)用原生功能的方法中,所述的啟動輪詢?yōu)?以預(yù)設(shè)時間間隔調(diào)用prompt ()方法,prompt ()方法再觸發(fā)經(jīng)過重寫的提示對話框方法。
[0019]本發(fā)明還公開了一種移動平臺上JavaScript調(diào)用原生功能的系統(tǒng),包括位于前端邏輯層的JavaScript模塊和位于底層原生層中的瀏覽器控件、組件管理類、消息隊列、執(zhí)行多種原生功能的多種功能組件;所述JavaScript模塊包括調(diào)用原生功能子模塊和輪詢子模塊,瀏覽器控件包括JS觸發(fā)模塊、開放有JavaScript接口的執(zhí)行原生功能模塊、開放有JavaScript接口的檢索消息模塊;
[0020]調(diào)用原生功能子模塊用于觸發(fā)JS觸發(fā)模塊中的經(jīng)過重寫的提示對話框方法;輪詢子模塊用于在網(wǎng)頁加載時啟動輪詢以不斷地觸發(fā)所述JS觸發(fā)模塊中的提示對話框方法;
[0021]JS觸發(fā)模塊中的經(jīng)過重寫的提示對話框方法在執(zhí)行時,首先對其參數(shù)進(jìn)行解析,如果根據(jù)解析結(jié)果判斷執(zhí)行原生功能,則繼續(xù)對參數(shù)進(jìn)行解析以獲取功能組件信息和調(diào)用方式,與執(zhí)行原生功能模塊的JavaScript接口配合以實現(xiàn)原生功能的調(diào)用;如果根據(jù)解析結(jié)果判斷查找消息隊列則與檢索消息模塊的JavaScript接口配合以實現(xiàn)從消息隊列中檢索結(jié)果;
[0022]組件管理類用于與執(zhí)行原生功能模塊配合實現(xiàn)原生功能的調(diào)用,如果調(diào)用方式為異步調(diào)用,則實例化新線程,在新線程中根據(jù)所述功能組件信息調(diào)用對應(yīng)的功能組件,啟動新線程后主線程原路返回,所述新線程在完成后把結(jié)果放入消息隊列中;如果調(diào)用方式為同步調(diào)用,則在主線程中根據(jù)所述功能組件信息調(diào)用對應(yīng)的功能組件,并在調(diào)用完畢后將執(zhí)行結(jié)果原路返回。
[0023]在本發(fā)明所述的移動平臺上JavaScript調(diào)用原生功能的系統(tǒng)中,JS觸發(fā)模塊中的經(jīng)過重寫的提示對話框方法具體包括:
[0024]如果提示對話框方法判斷出默認(rèn)字符串參數(shù)的前綴與預(yù)設(shè)的表示執(zhí)行原生功能的字符串相同,則根據(jù)默認(rèn)字符串參數(shù)的位于前綴后面的字符串獲取以下參數(shù)數(shù)據(jù):與功能組件唯一對應(yīng)的組件ID、與返回結(jié)果唯一對應(yīng)的Callbackld、調(diào)用方式以及其他參數(shù);
[0025]如果提示對話框方法判斷默認(rèn)字符串參數(shù)的前綴與預(yù)設(shè)的表示查找消息隊列的字符串相同,則根據(jù)默認(rèn)字符串參數(shù)的位于前綴后面的字符串獲取與返回結(jié)果唯一對應(yīng)的Callbackld;
[0026]如果前綴不屬于以上的兩種情況,則執(zhí)行默認(rèn)的操作,彈出提示對話框。
[0027]在本發(fā)明所述的移動平臺上JavaScript調(diào)用原生功能的系統(tǒng)中,所述執(zhí)行原生功能模塊的具有JavaScript接口的原生對象中的原生功能調(diào)用方法獲取JS觸發(fā)模塊中的參數(shù)數(shù)據(jù),再把參數(shù)數(shù)據(jù)發(fā)送給組件管理類的原生功能調(diào)用方法;
[0028]組件管理類中的原生功能調(diào)用方法在判斷調(diào)用方式為異步調(diào)用時,實例化新線程,在新線程中根據(jù)組件ID調(diào)用對應(yīng)的功能組件,啟動新線程后主線程原路返回,所述新線程在完成后把執(zhí)行結(jié)果與Callbackld綁定后放入消息隊列中;組件管理類中的原生功能調(diào)用方法在判斷調(diào)用方式為同步調(diào)用時,在主線程中根據(jù)組件ID調(diào)用對應(yīng)的功能組件,并在調(diào)用完畢后將執(zhí)行結(jié)果原路返回;
[0029]檢索消息模塊中的具有JavaScript接口的原生對象中的接收J(rèn)S消息方法獲取JS觸發(fā)模塊中的Ca 11 backl d,并根據(jù)Ca 11 back I d從消息隊列中查詢結(jié)果,并在有對應(yīng)的結(jié)果時將結(jié)果原路返回到網(wǎng)頁中。
[°03°]在本發(fā)明所述的移動平臺上JavaScript調(diào)用原生功能的系統(tǒng)中,所述的啟動輪詢?yōu)?以預(yù)設(shè)時間間隔調(diào)用promptO方法,prompt()方法再觸發(fā)JS觸發(fā)模塊中的經(jīng)過重寫的提示對話框方法。
[0031]實施本發(fā)明的移動平臺上JavaScript調(diào)用原生功能的方法以及系統(tǒng),具有以下有益效果:本發(fā)明重寫了提示對話框方法,根據(jù)重寫后的方法中的參數(shù)可以確定執(zhí)行同步調(diào)用還是異步調(diào)用,并對于異步調(diào)用的情況,通過新線程執(zhí)行完原生功能,并把結(jié)果放到了消息隊列中,通過Prompt輪詢可以在重寫的提示對話框方法的基礎(chǔ)上,從消息隊列讀取異步調(diào)用的返回結(jié)果。因此,本發(fā)明解決了 JavaScript不能異步調(diào)用原生功能的缺陷,統(tǒng)一了調(diào)用的模式,提高了 JavaScript與原生功能互相調(diào)用的靈活性。
【附圖說明】
[0032]下面將結(jié)合附圖及實施例對本發(fā)明作進(jìn)一步說明,附圖中:
[0033]圖1是傳統(tǒng)的JavaScript調(diào)用原生功能的結(jié)構(gòu)示意圖;
[0034]圖2是本發(fā)明移動平臺上JavaScript調(diào)用原生功能的方法的流程圖;
[00;35]圖3是本發(fā)明移動平臺上JavaScript調(diào)用原生功能的系統(tǒng)的結(jié)構(gòu)示意圖。
【具體實施方式】
[0036]為了對本發(fā)明的技術(shù)特征、目的和效果有更加清楚的理解,現(xiàn)對照附圖詳細(xì)說明本發(fā)明的【具體實施方式】。
[0037]參考圖2,是本發(fā)明移動平臺上JavaScript調(diào)用原生功能的方法的流程圖