應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明提供了一種應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng),其中方法包括:創(chuàng)建Activity模型;將創(chuàng)建好的Activity模型放入IOAM容器進(jìn)行管理;根據(jù)具體的開(kāi)發(fā)需求,對(duì)Activity模型進(jìn)行調(diào)用和參數(shù)配置。本發(fā)明提供的應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng),將傳統(tǒng)開(kāi)發(fā)流程進(jìn)行精簡(jiǎn)和篩選,去掉冗余和用不到的系統(tǒng)設(shè)置和操作,只留下必要的系統(tǒng)任務(wù)然后進(jìn)行封裝,將復(fù)雜的廣義面向?qū)ο蟾臑楹?jiǎn)單的過(guò)程化開(kāi)發(fā),程序員甚至可以不必精通安卓系統(tǒng)操作,只需編寫自己的業(yè)務(wù)相關(guān)代碼即可。最后通過(guò)IOAM(Inversion of Android Mudule)安卓模型反轉(zhuǎn)建立應(yīng)用Activity容器,統(tǒng)一注入管控。利用本發(fā)明提供的應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng),可以建立高效管理容器提高系統(tǒng)效率,通過(guò)過(guò)程化開(kāi)發(fā)模型降低開(kāi)發(fā)難度,通過(guò)減少開(kāi)發(fā)代碼量降低開(kāi)發(fā)bug發(fā)生率。
【專利說(shuō)明】
應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng)
技術(shù)領(lǐng)域
[0001] 本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng)。
【背景技術(shù)】
[0002] Activity是安卓開(kāi)發(fā)的基本單元。程序啟動(dòng)后,每次跳轉(zhuǎn)到新頁(yè)面時(shí),需要做經(jīng)過(guò) 以下流程,如圖1所示:
[0003] 1、顯式調(diào)用系統(tǒng)類Intent重新生成一個(gè)頁(yè)面的Activity實(shí)例;
[0004] 2、調(diào)用系統(tǒng)指定的Bundle實(shí)例化參數(shù);
[0005] 3、把參數(shù)序列化逐個(gè)放入Bundle實(shí)例;
[0006] 4、Bundle 注入 Activity 實(shí)例;
[0007] 5、調(diào)用內(nèi)部方法啟動(dòng)該Ac t i v i ty實(shí)例。
[0008] 傳統(tǒng)的安卓系統(tǒng)沒(méi)有提供對(duì)Activity的管控單元,也沒(méi)有嚴(yán)格參數(shù)規(guī)范。程序員 必須手動(dòng)建立Activity管控機(jī)制,對(duì)頁(yè)面參數(shù)逐一寫針對(duì)性代碼解析。在程序運(yùn)行一段時(shí) 間后,大量無(wú)主的Activity充斥內(nèi)存空間,造成內(nèi)存重復(fù)性浪費(fèi),也就是為什么我們的手機(jī) 會(huì)越用越卡的元兇,同時(shí),無(wú)主的Activity實(shí)例的存在還對(duì)程序員的思維縝密性提出了更 高的要求:當(dāng)程序涉及到異步訪問(wèn)、網(wǎng)絡(luò)延遲請(qǐng)求、管道處理、多線程作業(yè)模塊時(shí)設(shè)計(jì)邏輯 必須非常嚴(yán)謹(jǐn),否則會(huì)頻繁發(fā)生數(shù)據(jù)不同步,緩存未更新,數(shù)據(jù)操作失效,訪問(wèn)失效資源等, 造成數(shù)據(jù)錯(cuò)誤、程序卡死、閃退等現(xiàn)象??傊?,現(xiàn)有技術(shù)開(kāi)發(fā)設(shè)計(jì)復(fù)雜,新手上手慢;過(guò)于面 向?qū)ο笤O(shè)計(jì),系統(tǒng)效率低;沒(méi)有高效管理容器,開(kāi)發(fā)bug率高;頁(yè)面數(shù)據(jù)交互復(fù)雜,冗余代碼 多,易出錯(cuò)。
【發(fā)明內(nèi)容】
[0009] 為解決上述技術(shù)問(wèn)題,克服現(xiàn)有技術(shù)水平的缺點(diǎn)和不足,本發(fā)明提供一種應(yīng)用程 序開(kāi)發(fā)方法及系統(tǒng),將傳統(tǒng)開(kāi)發(fā)流程進(jìn)行精簡(jiǎn)和篩選,去掉冗余和用不到的系統(tǒng)設(shè)置和操 作,只留下必要的系統(tǒng)任務(wù)然后進(jìn)行封裝,將復(fù)雜的廣義面向?qū)ο蟾臑楹?jiǎn)單的過(guò)程化開(kāi)發(fā), 程序員甚至可以不必精通安卓系統(tǒng)操作,只需編寫自己的業(yè)務(wù)相關(guān)代碼即可。最后通過(guò) I0AM(Inversion of Android Mudule)安卓模型反轉(zhuǎn)建立應(yīng)用Activity容器,統(tǒng)一注入管 控。
[0010] 本發(fā)明提供的應(yīng)用程序開(kāi)發(fā)方法,包括以下步驟:
[0011] 創(chuàng)建 Activity 模型;
[0012] 將創(chuàng)建好的Activity模型放入I0AM容器進(jìn)行管理;
[0013] 根據(jù)具體的開(kāi)發(fā)需求,對(duì)Activity模型進(jìn)行調(diào)用和參數(shù)配置。
[0014] 相應(yīng)地,本發(fā)明還提供一種應(yīng)用程序開(kāi)發(fā)系統(tǒng),包括創(chuàng)建模塊、管理模塊以及調(diào)用 模塊;
[0015]所述倉(cāng)I健模塊,用于倉(cāng)I健Activity模型;
[0016]所述管理模塊,用于將創(chuàng)建好的Activity模型放入I0AM容器進(jìn)行管理;
[0017] 所述調(diào)用模塊,用于根據(jù)具體的開(kāi)發(fā)需求,對(duì)Activity模型進(jìn)行調(diào)用和參數(shù)配置。
[0018] 本發(fā)明相比于現(xiàn)有技術(shù)的有益效果在于:
[0019] 本發(fā)明提供的應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng),將傳統(tǒng)開(kāi)發(fā)流程進(jìn)行精簡(jiǎn)和篩選,去掉 冗余和用不到的系統(tǒng)設(shè)置和操作,只留下必要的系統(tǒng)任務(wù)然后進(jìn)行封裝,將復(fù)雜的廣義面 向?qū)ο蟾臑楹?jiǎn)單的過(guò)程化開(kāi)發(fā),程序員甚至可以不必精通安卓系統(tǒng)操作,只需編寫自己的 業(yè)務(wù)相關(guān)代碼即可。最后通過(guò)I〇AM(Inversion of Android Mudule)安卓模型反轉(zhuǎn)建立應(yīng) 用Activity容器,統(tǒng)一注入管控。利用本發(fā)明提供的應(yīng)用程序開(kāi)發(fā)方法及系統(tǒng),可以建立高 效管理容器提高系統(tǒng)效率,通過(guò)過(guò)程化開(kāi)發(fā)模型降低開(kāi)發(fā)難度,通過(guò)減少開(kāi)發(fā)代碼量降低 開(kāi)發(fā)bug發(fā)生率。
【附圖說(shuō)明】
[0020] 圖1為現(xiàn)有技術(shù)流程示意圖;
[0021] 圖2為本發(fā)明框架原理圖;
[0022] 圖 3是 Saaf-Activity 原理圖;
[0023]圖4是參數(shù)處理流程圖。
【具體實(shí)施方式】
[0024]以下結(jié)合附圖,對(duì)本發(fā)明上述的和另外的技術(shù)特征和優(yōu)點(diǎn)進(jìn)行清楚、完整地描述, 顯然,所描述的實(shí)施例僅僅是本發(fā)明的部分實(shí)施例,而不是全部實(shí)施例。
[0025] 一個(gè)Activity是一個(gè)基礎(chǔ)應(yīng)用程序組件,提供一個(gè)屏幕,用戶可以用來(lái)交互為了 完成某項(xiàng)任務(wù),例如撥號(hào)、拍照、發(fā)送email、看地圖。每一個(gè)activity被給予一個(gè)窗口,在上 面可以繪制用戶接口。窗口通常充滿屏幕,但也可以小于屏幕而浮于其它窗口之上。一個(gè)應(yīng) 用程序通常由多個(gè)activities組成,他們通常是松耦合關(guān)系。通常,一個(gè)應(yīng)用程序中的 activity被指定為〃main〃activity,當(dāng)?shù)谝淮螁?dòng)應(yīng)用程序的時(shí)候呈現(xiàn)給用戶的那個(gè) activity。每一個(gè)activity然后可以啟動(dòng)另一個(gè)activity為了完成不同的動(dòng)作。
[0026] I0AM容器專門負(fù)責(zé)Activity的引入和管理。I0AM在系統(tǒng)啟動(dòng)后會(huì)自動(dòng)讀取系統(tǒng)注 冊(cè)的Activity (manifest .xml中定義),并接管所有Activity實(shí)例的生成、調(diào)用、管理、釋放 等操作。
[0027]本發(fā)明提供了一種基于android系統(tǒng)原生語(yǔ)言(java)的敏捷快速開(kāi)發(fā)框架,將傳 統(tǒng)開(kāi)發(fā)流程進(jìn)行精簡(jiǎn)和篩選,去掉冗余和用不到的系統(tǒng)設(shè)置和操作,只留下必要的系統(tǒng)任 務(wù)然后進(jìn)行封裝,將復(fù)雜的廣義面向?qū)ο蟾臑楹?jiǎn)單的過(guò)程化開(kāi)發(fā),程序員甚至可以不必完 全精通安卓系統(tǒng)操作,只需編寫自己的業(yè)務(wù)相關(guān)代碼即可。最后配合I〇AM( Inversion of AndroidMudule)安卓模型反轉(zhuǎn)建立應(yīng)用Activity容器,開(kāi)發(fā)程序。
[0028] Saaf集成了 I0AM容器,重新定義了Activity的定義和規(guī)范,
[0029]由于android本質(zhì)上就是一堆Activity之前相互跳轉(zhuǎn)組成,所以Saaf框架本質(zhì)上 也是對(duì)Activity的重新定義和規(guī)范,同時(shí)集成了 I0AM容器,并對(duì)系統(tǒng)啟動(dòng)做了相關(guān)優(yōu)化處 理。
[0030]通過(guò)現(xiàn)有技術(shù)流程圖附圖1可以看出,大部分工作都是需要程序員手動(dòng)寫代碼完 成的,很多地方對(duì)于初級(jí)程序員來(lái)說(shuō)根本就不知道什么意思,也不知道工作原理,只知道照 搬別人代碼寫上去,導(dǎo)致大量無(wú)用代碼甚至錯(cuò)誤代碼堆積,給開(kāi)發(fā)和維護(hù)帶來(lái)很大阻力,開(kāi) 發(fā)難度很大
[0031]圖2中的所有步驟框架都已經(jīng)集成,程序員不需要編寫這部分代碼,只需按照上面 章節(jié)的例子,直接傳入?yún)?shù)即可。進(jìn)入新的頁(yè)面后,直接使用參數(shù)即可,沒(méi)有中間環(huán)節(jié),效率 高,出錯(cuò)少。
[0032]將傳統(tǒng)開(kāi)發(fā)流程進(jìn)行精簡(jiǎn)和篩選,去掉冗余和用不到的系統(tǒng)設(shè)置和操作,只留下 必要的系統(tǒng)任務(wù)然后進(jìn)行封裝,將復(fù)雜的廣義面向?qū)ο蟾臑楹?jiǎn)單的過(guò)程化開(kāi)發(fā),程序員甚 至可以不必精通安卓系統(tǒng)操作,只需編寫自己的業(yè)務(wù)相關(guān)代碼即可。最后通過(guò)I0AM (Inversion of Android Mudule)安卓模型反轉(zhuǎn)建立應(yīng)用Activity容器,統(tǒng)一注入管控。 [0033]本發(fā)明的邏輯流程圖和技術(shù)框架圖如圖2所示:
[0034] (1)頁(yè)面啟動(dòng)/跳轉(zhuǎn)時(shí),根據(jù)業(yè)務(wù)需要,只需定義參數(shù)的類型并賦值即可,不必定義 參數(shù)的名稱,這樣就避免了因大小寫、縮寫、編碼不同等導(dǎo)致的參數(shù)名稱前后不一致而帶來(lái) 的各種各樣的錯(cuò)誤。
[0035] (1)定義Activity參數(shù),參數(shù)定義下面參數(shù)章節(jié)介紹。
[0036] (2)通過(guò)I0AM容器進(jìn)入新的頁(yè)面并傳入?yún)?shù),進(jìn)入步驟(4)
[0037] (3)老頁(yè)面自動(dòng)回歸I0AM容器,沒(méi)有垃圾內(nèi)存。老頁(yè)面在不用時(shí),就像java的引用 機(jī)制一樣,直接不去管即可。I0AM容器會(huì)自動(dòng)回收,并根據(jù)系統(tǒng)資源情況進(jìn)行任務(wù)cache調(diào) 整,增加系統(tǒng)效率。
[0038] (4)進(jìn)入頁(yè)面后,通過(guò)過(guò)程化框架流式處理解析參數(shù)(參數(shù)解析后面參數(shù)章節(jié)介 紹)。
[0039] (5)參數(shù)解析完成后,過(guò)程化框架統(tǒng)一處理各種系統(tǒng)定義,回調(diào)定義,系統(tǒng)事件處 理(各種系統(tǒng)定義及處理將在Activity章節(jié)介紹)。
[0040] (6)用戶在規(guī)定好的方法和回調(diào)中完善自己的業(yè)務(wù)邏輯,具體見(jiàn)(5)中說(shuō)明
[0041] (7)系統(tǒng)運(yùn)行,跳轉(zhuǎn)到其他頁(yè)面,進(jìn)入(1)
[0042] (8)系統(tǒng)退出,I0AM容器退出,釋放內(nèi)存。
[0043] (9)系統(tǒng)以android框架為基礎(chǔ),通過(guò)對(duì)大量中小型android-app的開(kāi)發(fā)過(guò)程和需 求進(jìn)行研究,結(jié)合多年的開(kāi)發(fā)經(jīng)驗(yàn)積累,對(duì)andorid程序啟動(dòng)后的處理流程進(jìn)行重新定義, 對(duì)Activity進(jìn)行功能擴(kuò)充,加入泛型參數(shù)處理(不限制參數(shù)個(gè)數(shù),不需要定義參數(shù)名稱),頂 部工具欄(topBar)通用樣式定義及處理,底部工具欄(bottomBar)通用樣式處理,通用個(gè)事 務(wù)處理(按鈕處理,觸摸屏處理,彈出框回調(diào)處理,異步處理-一般用于服務(wù)器訪問(wèn)和圖片加 載),fragment處理,地圖插件集成,然后重新封裝打包成新的Activity模板SAAFActivity。 SAAFActivity是SAAF框架的主體,同時(shí)SAAF還有自己獨(dú)有的安卓控件、異步圖片處理、網(wǎng)絡(luò) 處理封裝,為開(kāi)發(fā)人員實(shí)現(xiàn)傻瓜式開(kāi)發(fā)提供良好的平臺(tái)。
[0044] 參數(shù)處理,如圖4所示
[0045] 參數(shù)傳遞實(shí)現(xiàn)
[0046] 程序員要啟動(dòng)某個(gè)Activity,首先創(chuàng)建一個(gè)泛型數(shù)組,即Object類型,Object是所 有自定義類型的基類。每一個(gè)Activity都會(huì)有一個(gè)啟動(dòng)需要的入?yún)⒌恼f(shuō)明,按照說(shuō)明將啟 動(dòng)這個(gè)Activity需要用到的參數(shù)一一賦值到這個(gè)泛型數(shù)組之中,有幾個(gè)寫幾個(gè),忽略類型 和參數(shù)名字,saaf?會(huì)通過(guò)反射機(jī)制識(shí)別參數(shù)類型;參數(shù)賦值后,程序要通過(guò)I0AM容器直接啟 動(dòng)新的Activity,同時(shí)參數(shù)傳遞到Activity Activity接收到參數(shù)后,首先進(jìn)行合法性校 驗(yàn),如果參數(shù)有異常則直接報(bào)錯(cuò)并記錄日志,為保證程序的健壯性避免閃退,在程序運(yùn)行時(shí) 會(huì)將錯(cuò)誤參數(shù)賦值成默認(rèn)值,包含出錯(cuò)信息,并允許程序繼續(xù)執(zhí)行,程序員會(huì)發(fā)現(xiàn)這個(gè)錯(cuò)誤 并處理,如果實(shí)在用戶使用過(guò)程中,即使程序確實(shí)有問(wèn)題,也可以大大減少閃退帶來(lái)的用戶 體驗(yàn)減弱。
[0047]參數(shù)校驗(yàn)成功后,基于java反射機(jī)制,系統(tǒng)首先遍歷泛型參數(shù)數(shù)組反射出參數(shù)類 型數(shù)組els. getClass 〇,然后,組裝外部參數(shù)類,組裝好后將類型數(shù)組作為參數(shù)創(chuàng)建構(gòu)造函 數(shù)方法,實(shí)例化參數(shù)類,并序列化數(shù)據(jù)包后放入系統(tǒng)bundle空間進(jìn)行保存。Bundle是系統(tǒng)提 供的供Activity使用的臨時(shí)參數(shù)存儲(chǔ),為提高效率,我們繼續(xù)復(fù)用這個(gè)系統(tǒng)設(shè)置。至此,在 使用該也面前,參數(shù)的準(zhǔn)備工作結(jié)束。
[0048]參數(shù)傳遞使用場(chǎng)景
[0049] 根據(jù)業(yè)務(wù)需要,只需定義參數(shù)的類型并賦值即可,不必定義參數(shù)的名稱。
[0050] 優(yōu)點(diǎn):這樣就避免了因大小寫、縮寫、編碼不同等導(dǎo)致的參數(shù)名稱前后不一致而帶 來(lái)的各種各樣的錯(cuò)誤。
[0051 ]例:
[0052]如原來(lái)傳參數(shù)許這樣定義: Iritcnl intern. = new Intcni(gctApplicationCoritcxt()" OlhcrAcliviiy.class); //以下二個(gè)為Other Activity傳參數(shù) intent.puiExtra("Namc", "cboy"); intent.pulExtra("Age", 22);
[0053] //也可以使用Bundle來(lái)傳參數(shù) Bundle bundle = new Bundlc(); bundle.putSlring("Name 1", "cboy 1"); bundlc.putInt("Agcr', 23); intent.pulExtras( bundle);
[0054] slariAciivily(inteiu);
[0055] 首先根據(jù)Activity的類型,通過(guò)系統(tǒng)的內(nèi)容對(duì)象創(chuàng)建intent對(duì)象。
[0056] 程序員必須清楚的知道自己放的參數(shù)名字及大小寫規(guī)范,一點(diǎn)都不能出錯(cuò), "name" "Name" "NAME"是完全不同的參數(shù),增加了程序員的工作量,尤其是涉及到復(fù)雜參數(shù) 命名時(shí),如
[0057] "MySchoolTeacher""mySchoolTeacher""myschoolTeacher""myschoolteacher"" my_S Ch〇〇lTeaCher"等等很多,不同的習(xí)書寫慣,不同的手誤等都會(huì)造成參數(shù)獲取不到或者 獲取不正確,更糟糕的是,由于編譯器的容錯(cuò)越來(lái)越強(qiáng),一些程序問(wèn)題并不會(huì)引起程序崩潰 或者編譯器報(bào)錯(cuò),這就加大了問(wèn)題的隱藏深度;同時(shí)由于參數(shù)的存在,加大了程序員的記憶 工作量,當(dāng)Activity過(guò)多的時(shí)候,參數(shù)記憶混亂是很常見(jiàn)的現(xiàn)象,尤其是大小姐和多一個(gè)或 者少一個(gè)字母。
[0058] 最后當(dāng)參數(shù)賦值完成后,調(diào)用系統(tǒng)startActivity方法啟動(dòng)新的Activity。
[0059]現(xiàn)在只需要這樣傳參數(shù)
[0060] 通過(guò)I0AM啟動(dòng)Activity,直接輸入Activity的類型和參數(shù)數(shù)組,并且參數(shù)無(wú)需定 義參數(shù)名稱,甚至可以傳入對(duì)象實(shí)例:
[0061] IOAMstartActivity(OtherActivity.class,new Object[]{new ClassA(), 0 ? 23423,1212," teststring"});
[0062]整數(shù),字符串,長(zhǎng)整形,浮點(diǎn),布爾,甚至對(duì)象類型皆可,
[0063] 程序員唯一要做的就是,對(duì)照要調(diào)用的Activity的說(shuō)明,按次序放入即可。
[0064] 2.2.3參數(shù)解析實(shí)現(xiàn)
[0065] 定義:每一個(gè)saaf-Activity都默認(rèn)生成一個(gè)外部參數(shù)類。該類為Activity的內(nèi)部 類,專門定義外部參數(shù)使用,該Activity的調(diào)用規(guī)范也是由此生成。參數(shù)類名稱Activity 名稱+"param" ?
[0066] Class ClsA extends SAAFActivity{
[0067] //定義內(nèi)部參數(shù)類
[0068] Public static class ClsAParam{//
[0069] }
[0070] }
[0071 ]注:內(nèi)部參數(shù)類只是簡(jiǎn)單地po jo-bean,即只有簡(jiǎn)單參數(shù)定義和get/set方法和構(gòu) 造函數(shù),不包含邏輯。
[0072]解析工作由saaf框架系統(tǒng)自動(dòng)完成:
[0073]頁(yè)面啟動(dòng)成功后,從系統(tǒng)boundle中將序列化參數(shù)包取出,為了防止各種問(wèn)題引起 的丟失,對(duì)數(shù)據(jù)包的完整做有效性校驗(yàn),校驗(yàn)成功則獲取參數(shù)包對(duì)象,并對(duì)對(duì)象中每個(gè)參數(shù) 做邏輯合理性二次校驗(yàn),最后通過(guò)繼承的param內(nèi)部參數(shù)供Activity實(shí)例使用。
[0074] 2.2.4參數(shù)解析使用場(chǎng)景
[0075] Activity在繼承SAAFActivity后自動(dòng)獲得一個(gè)內(nèi)部基類的參數(shù)param:
[0076] ClsAParam param;
[0077] 當(dāng)該Activity被調(diào)用時(shí)這個(gè)參數(shù)被系統(tǒng)自動(dòng)自動(dòng)解析及賦值,在Activity對(duì)象周 期內(nèi)直接使用即可。
[0078] 例:Class ClsA extends SAAFActivity{
[0079] //任意內(nèi)部方法
[0080] Public void functionA(){
[0081] //需要時(shí)直接使用即可,沒(méi)有顯示需要程序員處理解析的工作
[0082] System.out.printf( "參數(shù)為" +param ? int_a+" ; " +param ? long_a+" ; " + param.float_a);
[0083] }
[0084] //定義內(nèi)部參數(shù)類
[0085] Public static class ClsAParam{//
[0086] Private int int_a;
[0087] Private long long_a;
[0088] Private float float_a;
[0089] //省略get/set方法及構(gòu)造函數(shù)
[0090] }
[0091] }
[0092] 2 ? 3Saaf_Activity 定義
[0093] Saaf實(shí)現(xiàn)了對(duì)Activity進(jìn)行功能擴(kuò)充,除了上面提到的加入?yún)?shù)處理外,還提供 了頂部工具欄(topBar)通用樣式定義及處理,底部工具欄(bottomBar)通用樣式處理,通用 個(gè)事務(wù)處理(按鈕處理,觸摸屏處理,彈出框回調(diào)處理,異步處理-一般用于服務(wù)器訪問(wèn)和圖 片加載),fragment處理,地圖插件集成,然后重新封裝打包成新的Activity 八〇1:;[¥;^7。533€401:;[¥;^7是544?框架的主體,同時(shí)544?還有自己獨(dú)有的安卓控件、異步圖片 處理、網(wǎng)絡(luò)處理封裝,為開(kāi)發(fā)人員實(shí)現(xiàn)傻瓜式開(kāi)發(fā)提供良好的平臺(tái)。
[0094] Saaf-Activity 基于安卓原生框架 FragmentActivity 實(shí)現(xiàn)。
[0095] 2 ? 3 ? ISaaf-Activity 應(yīng)用實(shí)例
[0096] Public class ClasA extends SaafActivity{
[0097] //繼承自原生系統(tǒng),用戶處理創(chuàng)建信息,如設(shè)置頁(yè)面配置文件,定義業(yè)務(wù)空間等 [0098] protectedvoid onCreate(Bundle savedlnstanceState){}
[0099] //處理所有控件的點(diǎn)擊事件
[0100] publicvoid onClick(View v){}
[0101] //如果使用了列表、地圖等需要初始化數(shù)據(jù)的控件,再此對(duì)列表控件進(jìn)行數(shù)據(jù)賦 值
[0102] publicvoid initialize(0bject obj){}
[0103] //處理特殊控件的異步處理,比如異步加載列表圖片,或者發(fā)送到服務(wù)器交互數(shù) 據(jù),接收后需//要異步刷新屏幕等
[0104] publicvoid handle(View view,Object param){}
[0105] /*設(shè)置頂部和底部標(biāo)題欄的樣式配置文件,如果不設(shè)置,則頂部標(biāo)題或者底部標(biāo) 題欄為空
[0106] *根據(jù)常規(guī)app開(kāi)發(fā)習(xí)慣,一般都有頂部和底部標(biāo)題欄,saaf已經(jīng)內(nèi)置,只需設(shè)置好 樣式
[0107] *即可,對(duì)應(yīng)的按鍵響應(yīng)處理在上述處理方法函數(shù)中統(tǒng)一處理即可。如果不設(shè)置, 則頂部或底部欄不顯示
[0108] */
[0109] public Object getInstanceParam(0bject obj)
[0110] }
[0111] 2 ? 3 ? 2Saaf_Activity 定義
[0112]定義頂部底部工具欄通用處理模板:
[0113] Public class SaalActivity{
[0114] //頊部欄工具欄定義 protected Fragment mP'ragmcnlTopBar; //底部工具欄定義 protected Fragment mFragmentBottoniBar; //定義管理器 protected FragmcnlManagcr fragmcnlManagcr; //定義欄目操作,進(jìn)行添加,移除,替換,以及執(zhí)行其他動(dòng)作 protected FragmenlTransacliori IragmcnlTransacliori; 產(chǎn)此處是系統(tǒng)默認(rèn)執(zhí)行,用戶頂部底部欄的初始化,如果有則設(shè)置,沒(méi)有則無(wú)需 設(shè)置 *:/ protectedvoid onCrcatc(BundIc savedlnsianccStatc, int layoulld, int topld, int bottomld) { super.onCrcatc(savcdlnslanccSlalc); rcqucslWindo\vFcalurc(Window.FEATURE_NO_TITLE); setGont賴 fVie^Klayoutld); fragmcntManagcr = gclSupporlFragmcntManagcn); IVagmentTransaction = l、n:tgmcnt!V1anagcr.bcginTranbaction(); lf(iopld>0) this.mFragmcniTopBar = iVagmcnlManager.nndFragmcnlById(topid}; if (bollomld > 0) this.mFragmentBottDmBar = fragmentManager .(1 n d F iTigiric ntById(bQtt〇mId); fragmenlTransaction = fragmcnlManagcr.bcginTransacuon() .hidc(rnFragmcnl7bpBar).hiclc(mFragmcnlBoUomBar); rragmcnlTransaction,show(mFragmcnls[0])>commit(); } }
[0115] 首先將滿屏劃分成三個(gè)區(qū)域:頂部區(qū)域,中間主體區(qū)域,底部欄區(qū)域,同時(shí)如果 Activity中設(shè)置了頂部和底部邊欄,則進(jìn)行初始化。
[0116] 系統(tǒng)觸摸鍵默認(rèn)處理: @〇Yerride publicboolean onTouchIVicvv v, MotionEvcnl event) { switch (event.gctAclion〇) { MotionE:veiit,ACTI〇N_D〇TO: //按下 Alpha.down(v); break; case MotionEvenLACTION MOVE:
[0117] //移動(dòng) break; case MotionEvcnl.ACTION_UP: //抬起 Aipha,up(^); break; } returnfalse* }
[0118] 異步網(wǎng)絡(luò)處理:
[0119] publicvoid doAsyncTask(JSONObjccl json) { As^ncTask< J S O N Obj cct, Integer, Striixg> task = new 八syncTask<JSONObject, Integer, String>(} { (^Override proteefedvoid onPrcExecute() { super.onPrcExcculcO; }
[0120] @〇¥emde protectedvoid onPoslExccutc(Sl.ring jsortsir) J if (jsonslr == null) return; .ISONObjccl rcsullllag = null; JSONObjccl rcsulijson; try {. resulijson = new JSONObjccUjsonslr); resultflag = rcsuhjson.gcUSONObjccl("rcsuir); String sresultflag = resultflag.getStrirLg("tesxilt'1); iffsrosultnag ==iiull || srcsultilag.cquals(,,M) || LM Rcsull.SUCC FED i^lntogor.parscln^srcsull flag)) j Toast.makeText(Tqba〇 A c i i v i ty. t his9 R.string.gct-inr〇」hil,Toast 丄 ENGTH-SHORT); }else { poslAsyncTask(rcsulUlag); } | catch (org.json.jSONExccplion c) { // TODO Auto-generalcd catch block c.prinlSlackTrace(); > } (^Override protected String doInBackgrouncKJSONObjccl.,, argO) { // TG)DO Auto-generated method stub String jsonstr = HUpUiil,posUson(TqbaoGlobal.URL_CMD, arg()[0]); return jsonstr; }
[0121] ?Override protected void on ProgrcssU pdalc( I nlcgcr... process)} } /, task, ex cc ul c(j so n); }
[0122] 系統(tǒng)在這里會(huì)重啟一個(gè)線程,根據(jù)用戶設(shè)置的訪問(wèn)數(shù)據(jù)和地址,進(jìn)行網(wǎng)絡(luò)異步訪 問(wèn),訪問(wèn)返回后,則調(diào)用系統(tǒng)預(yù)設(shè)的回調(diào)函數(shù),回調(diào)函數(shù)由用戶在繼承SAAFActivity后在 Activity類中實(shí)現(xiàn),方法為:publievoid handle(View view,0bject param),在應(yīng)用實(shí)例 中已經(jīng)列舉出。
[0123] 緩存和異步加載: publicclassAsynLoadcr j McnioryCachc rncmoryCachc = new McnioryCachc(); FilcCachc UlcCachc; p riv a teMarXObiccl, S iring> Ob j M ap = Collections ,synchronizedMap(ne>\WcakHashMap<ObiccU Stxing>());
[0124] publicAsynLDader (Cotitext cotitext., String dir) J IllcCachc = new FiicCachc(conicxU dir); // cxcculorScrvicc=Excculors.ncwFixcdThrcadPool(5); } flna]intslub_id = R.dvsi\w^h\o.ic_launchcr: //用戶顯示圖片 pubhcvoid Displaylma^c(String url. Ima^cView imagcVicw) { imaRcVicws.DuUima^cVicw. url); Bitmap bitmap = mcmoryCachc,gcl(urI); if (bitmap != null) i mage View, set I magcBitmap(bitmap); :el.se.{ qucucObj(url, imagcVicw);
[0125] i mage View, sci I magcRcsourco(s{ ub_id); } } //異步加載隊(duì)列,這里新建線程異步處理 privateYOid qaeueObj (Siring url, I mage View imago View) //編碼緩存文件 privateE^ilmap dccodeFilc(Filo f) {} //用于顯示位圖在UI線程 publicclass BitmapDispiaycr implements Runnable!!
[0126] 說(shuō)明:異步加載將需要加載的內(nèi)容進(jìn)行泛化處理,通過(guò)內(nèi)存和物理存儲(chǔ)進(jìn)行二維 加載,以提高效率和性能,異步加載主要用于圖片和音樂(lè)。
[0127] 自動(dòng)參數(shù)類: miblicclasslQAMAclivilies { proteetedstatie 丨()AM/oam;//ioam 容器 privatetlna]statieSlnngS7r_Paraf7r=="Param,!: privatetlnalstatieSjijng/7/ag//7/m?^/C7>m:== M$";
[0128] ^ privatefinalstaticString5?r "Aciivil.y"; p u b I i csfati cClass gel Activity (String key) { Class cls===ioam,gcl(kcy); // i l(ds==^null) if cb= activity Map.gcU Welcome); return c!s; } publicstaticClass geiAciivilyParam(Striiig key)} Class c 1 s=icam.gcl( kcy); String classnamc=cls.gctNamc(); Str^ simpleGlassname=classname;substring(cla$siiameiastIndexOf(n. ,,)+l); int aclivilyindcx=simplcclassname,indcxQr(5fr Activity): if(aclivilyindcx>0) simpledassname-sii^leclassname.substring(0, aetivityindex);
[0129] c\sjSsnmvc+=Fla^InternalClass+%\mp\cc\<issnamc+Str Param: try { 施 mefol姐師 e); l catch (ClassNolFounclExccplion c) ! // TODO Aulo-gcncraled catch block e.priiitStackTraceQ; } returnnuH; } }
[0130] 定義規(guī)則:
[0131 ]每個(gè) Activity 類必須以" Activity"結(jié)尾。
[0132] 參數(shù)類為原Activity類名+標(biāo)識(shí)flag" $" +字符串"Param"組成,系統(tǒng)將自動(dòng)獲取原 類名并解析拼裝字符串,并使用反射機(jī)制獲取參數(shù)類類型定義。
[0133] 系統(tǒng)控件事件處理:
[0134] 定義基類的繼承和接口實(shí)現(xiàn):
[0135] piiblicabstractclassSaaFActivitvextendsFraamcnlActivityimpleineiifsOnClickLisLcn or ,QnTouchListener,LMCallback { public void onCrcalc(Bundle savcdlnstanccStaic)
[0136] i supcr.onCroalcfsavcdinslanccSialc); LincarLayoul lo^inLayout = (LincarLayoul) ^ciLcivoullnllalcrOMnilalcfR.layout.main, null); String 遍歷所有控件 for (ini i = 0; i < lo^inLayoui.^clChildCouniO; iH-+)
[ View v=lo^inLayoumelChildAl(i); //如f可判斷是BixUon或者是TextBox 祖 Objecl v = 1.abWicU.;et,ge1.ChildAl.(i); if (v inslanceorRclaiivcLayom) ! i i f (v instaitceof Texivicw) j ((TextView)v),setOnClickListener(this); ((TextView)v)X)nTouchListener(this); i }
[0137] 說(shuō)明:在底層saaf-Activity除了實(shí)現(xiàn)原生android基類外,還用Activity本體實(shí) 現(xiàn)了點(diǎn)擊、觸摸、系統(tǒng)回調(diào)的通用接口,并對(duì)系統(tǒng)的所有控件進(jìn)行遍歷,將其常用回調(diào)設(shè)置 為本體Activity,這樣在程序員開(kāi)發(fā)時(shí),就無(wú)需關(guān)注和了解這些系統(tǒng)內(nèi)部操作,只需要在自 己的Activity頁(yè)面定義需要哪些控件,然后直接在頁(yè)面回調(diào)中直接書寫邏輯即可。
[0138] 圖形列表處理:
[0139] 定義框架控件類 publicabstractclassSaatListVicvvimplementsOnScroll Listener, OnllcmClickLislcncr !
[0140] protected ListViewly = null; //原始數(shù)據(jù)list publicMap<Slrina:,Qbicci>ori〇nDataMap = iiewHashMap<SlrinaX)bicct>();
[0141] public LemansAdapter adapter = null; public ArrayList<LcmansAdaDlcrDaia>itomLisl = newArrayList<LcmansAdaptcrDala>();// list view 111 的數(shù)姑 G piiblicArravList<LemansAdaDLcrDaia>cacheitemList = newArrayLisl<LcmansAdanicrDala>〇;// .)_)丨丨跋 listvicw I臨丨H' listilcni publiciiitpagcno = 1; puhlicClassoraindataTvpe://數(shù) iV丨戈把 privateActivityactivity;// k 卜義-的 Activity priVateLisKLemaiisListAsvrioTask^in AynsThread = newAjravLisl<LciT!ansLis!AsyncTask>();//^W\ 射丨 }
[0142 ]基于saaf框架的1 i s tv i ew的特色為使用簡(jiǎn)單,主要體現(xiàn)在以下方面:自動(dòng)緩存、泛 型數(shù)據(jù)加載、通用控件事件處理。當(dāng)然,SaafListView也是基于原生安卓的listview進(jìn)行結(jié) 構(gòu)化的封裝。
[0143] 自動(dòng)緩存:
[0144] 通過(guò)上面的框架控制內(nèi)部參量可以看出,控件在原有android基礎(chǔ)上,專門加入了 緩存的list:cacheitemList,該緩存list在整個(gè)listview工作時(shí)同步工作,當(dāng)滾動(dòng)翻頁(yè)是 總是早行一步,用戶下翻時(shí)自動(dòng)觸發(fā)下一頁(yè)的數(shù)據(jù)加載,使用戶下翻時(shí)幾乎體會(huì)不到停滯 感覺(jué),提升用戶體驗(yàn)。
[0145] 泛型數(shù)據(jù)加載:
[0146] 使用場(chǎng)景: Saal'Adapter adapter=newSaafLislAdapter(gelAclivity(), R.kyout.item_i d.
[0147] - newint[]{,"|, itcmListdala);
[0148] 基于Saaf框架的調(diào)用簡(jiǎn)單,只需傳入上線文Activity,同時(shí)設(shè)置樣式id;為了保證 賦值準(zhǔn)確,只需要將樣式中需要賦值的對(duì)象id組合成模板數(shù)組即可,最后一個(gè)是數(shù)據(jù)列表, 格式為按照上面的數(shù)據(jù)模板組織的一條條數(shù)據(jù),數(shù)據(jù)不用設(shè)置類型,直接放入即可,與參數(shù) 處理差不多,實(shí)際處理過(guò)程如下: publicView get¥iew(int position, View convertView, ViewGroup parent) | View vi=convertVicw; if(convcrlVicw==null) yi = mjfer^.mflateOayout item id, null); int count-ids. length; for(int i=0;i<counl;i++)j View v=viJ]ndVicwById(icls[i]}; Class cls^y.getClassO; LemansAdaptcrData d二 lisl.^clfposiiion); Method m; Object obi = null;
[0149] try }; m = d.gct£Mass().gciMclhod(Mgot.Parain,f + i); obj=m, mvoke(d) } catch (SecurityException c) ! // TODO Aulo-gcncratcd calch block e,printStaekTraee()j } catch (NoSuchMclhodException c) \ i! TODO Aulo-gcncratcd calch block efjjrintStackXFace(); catch (lilcRalAr^umcnlExccnlion c) J // TODO Aulo-gcncratcd calch block efjjrintStackXFace(); catch (lilcgalAccessExccplion c) {
[0150] // TODO Auto-generated catch block c.prinlStackTraccO; | catch (InvocalionTar^clException c) { // TODO Auto-generated catch block c.prinlSlackTracc(); } if(obj==n:ull){ Syslcm,oul.Drinl(M####nul! error at position:"十position+"indax=,'十i); } if(ets^=ImageView,class) { SysApplicalion.//;;^,e^ Z.〇^/^r.Disp]ayhncmc(sourccUrl+(SlrinH)obj\ (lma£cVicw)v); } eIseif(cis=-TcxlVicvv,ciass) { (("foxlVicw)v).sclTcxl-(obi,loSlrini>()); if(difSTRIKE_THRU(v.getId())){//判斷是否加刪除線 ((TcxlVicwHI.gelPaintO.sclFla^Paint.STRlKE THRU TEXT FLAG ); } } elseif( BuUon.class^cls) { ((BuUon)v),sciTcxi((Slrin^)Qbil; !elseif(ImaRcBuUon,class=:=cls)i SysApDlicat.iori,//;^,e^ Z,or7^enDisDlaYlma^c(sourccUrl+(SlrinR)obj, (ImageBullon)v); j eiseif(RajjngBar.class==cls) | ((RalirmRar)v).sclRaiing(((inlc^cr)obi)%5); jelse { Svstcmf〇ui.priiH("#####adaplcr error ai position="+posiUon+"index=''+i); } i
[0151 ] return vi; //irtil(vi); }
[0152] 流程說(shuō)明:
[0153] 1、系統(tǒng)會(huì)遍歷當(dāng)前l(fā)istview條目模板中的各個(gè)控件,每個(gè)控件獨(dú)有指定的id (android定義);
[0154] 2、將這個(gè)id與入?yún)⒅械哪0錳d進(jìn)行匹配
[0155] 3、匹配成功,通過(guò)類型反射獲取類型
[0156] 4、對(duì)各種類型進(jìn)行不同的處理,如TextView, ImageView, ImageButton等等,對(duì)各 種可能用的情況進(jìn)行枚舉,系統(tǒng)在這里統(tǒng)一進(jìn)行處理后,對(duì)程序員來(lái)說(shuō),只需要傳入數(shù)值即 可,其他可以都不用管,交給系統(tǒng)即可。
[0157] 5、根據(jù)設(shè)置的數(shù)據(jù)參數(shù)進(jìn)行索引和自動(dòng)賦值
[0158] 6、全部遍歷完成,賦值結(jié)束
[0159] 通用控件事件處理:
[0160]基于SAAF統(tǒng)一框架實(shí)現(xiàn),所有控件皆統(tǒng)一處理,參考上一章節(jié)實(shí)現(xiàn),這里不再贅 述。
[0161]以上所述的具體實(shí)施例,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步的 詳細(xì)說(shuō)明,應(yīng)當(dāng)理解,以上所述僅為本發(fā)明的具體實(shí)施例而已,并不用于限定本發(fā)明的保護(hù) 范圍。特別指出,對(duì)于本領(lǐng)域技術(shù)人員來(lái)說(shuō),凡在本發(fā)明的精神和原則之內(nèi),所做的任何修 改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【主權(quán)項(xiàng)】
1. 一種應(yīng)用程序開(kāi)發(fā)方法,其特征在于,包括以下步驟: 創(chuàng)建Activity模型; 將創(chuàng)建好的Activity模型放入IOAM容器進(jìn)行管理; 根據(jù)具體的開(kāi)發(fā)需求,對(duì)Activity模型進(jìn)行調(diào)用和參數(shù)配置。2. -種應(yīng)用程序開(kāi)發(fā)系統(tǒng),其特征在于,包括創(chuàng)建模塊、管理模塊以及調(diào)用模塊; 所述創(chuàng)建模塊,用于創(chuàng)建Activity模型; 所述管理模塊,用于將創(chuàng)建好的Activity模型放入IOAM容器進(jìn)行管理; 所述調(diào)用模塊,用于根據(jù)具體的開(kāi)發(fā)需求,對(duì)Activity模型進(jìn)行調(diào)用和參數(shù)配置。
【文檔編號(hào)】G06F9/44GK105893061SQ201610411765
【公開(kāi)日】2016年8月24日
【申請(qǐng)日】2016年6月12日
【發(fā)明人】高銘
【申請(qǐng)人】杭州勒芒科技有限公司