去年作了一個相似於個人朋友圈的項目,主要功能就是用戶能夠實時發表本身的動態,好友能夠評論點贊什麼的,能夠建羣,聊天啊,拉黑啊,反正是一個不錯的社交軟件,包含服務端和客戶端,服務端是jsp,客戶端不用說固然是android啦。php
先上幾張圖漲漲眼球:java
廢話很少說,直接上設計(也就是當時的論文,我這我的比較懶,直接粘貼過來了,不過文字好粘貼,圖片但是太難弄了,一張一張的 ,,嗚嗚嗚。。。。):android
安卓交互軟件-微圈的設計與實現程序員
咱們己經邁進移動互聯網時代,手機己經成爲了咱們不可或缺的工具。手機客戶端也迎來井噴發展期,如今只要是有點規模的學校或組織都但願能有一個屬於本身的手機應用來達到他們的盈利、宣傳等目的。由於手機的便攜性,安裝在手機上的手機應用的使用頻率很高,同時它的卸載率也比電腦上的應用要高,所以,設計並實現一個用戶滿意度高、使用方便的手機應用對學校來講頗爲重要。web
本文結合本實驗室與學校合做的實際項目,設計並開發了一款基於安卓的移動客戶端系統,包括手機應用以及相應的服務器端接口的開發。根據學校的提出的實際需求,咱們進行了需求分析並進行了模塊劃分與開發流程的設計,模塊劃分爲:登陸註冊模塊、朋友圈模塊、掃描二維碼模塊和客服公告模塊,每個模塊都對應一個或幾個服務器端接口,服務器端接口使用JAVA語言實現,運行環境使用了Tomcat,數據庫使用的是開源的MySQL。本文主要完成的工做有:安卓應用軟件界面設計、安卓應用軟件各個功能模塊的開發、數據庫的設計服務器端接口的設計與實現。本文介紹了各個模塊的實現方法,利用流程圖和關鍵代碼的方式對各個功能模塊進行了詳細說明,針對比較有表明性的模塊,例如登陸註冊模塊和朋友圈模塊,進行了比較詳細的介紹,同時針對模塊中比較重要的功能,例如,上拉刷新,下拉加載更多,雙擊退出應用程序等功能,進行了比較詳細的講解,包括它們的實現原理以及關鍵代碼實現細節。本文設計了手機端軟件和服務器端的框架,具備良好的擴展性和通用性,可以比較低成本的快速的進行二次開發。咱們介紹客戶端軟件時,由於各個功能模塊相對比較獨立,咱們介紹的比較詳細,對服務器端各個接口的設計與實現只詳細介紹了一下登陸註冊模塊對應的接口實現,由於各個接口的設計與實現的思路大致相差很少,針對數據庫的設計咱們只重點介紹了最終的全部表的結構和數據類型,由於篇幅和重要度相比其餘稍低等緣由,咱們對它的具體中間設計細節沒有進行更多的講解。chrome
最後對系統的每一個功能模塊和用戶界面分別進行了測試,儘量發現系統的問題並進步完善系統。在開發的末期,咱們開發人員己經進行了白盒測試,本身感受沒有問題後找了幾個未參與開發的同窗們從用戶的角度進行了黑盒測試。目前本移動客戶端軟件系統己經被某學校實際使用中,系統的使用反饋良好,可以較好的知足學校和用戶的使用需求。數據庫
關鍵詞: 安卓,移動客戶端,服務器端接口,朋友圈,系統開發編程
本課題根據某學校提出的具體需求研究了移動客戶端系統的總體設計與實現,包括手機客戶端的界面設計,功能設計,功能實現與對應的服務器端的接口設計與實現。設計模式
隨着移動終端市場的發展以及人們對移動手機依賴性的提升,用戶對安裝在手機的各種應用的需求也愈發旺盛。手機應用之間的競爭愈來愈激烈,只有那些提供更加友好的界面,而且可以知足用戶的使用需求的應用軟件才能存活下來。移動客戶端通常要依託服務器才能正常運行,在手機上更加方便的完成一些互聯網需求,例如國外的NBA視頻客戶端和國內的阿里巴巴手機客戶端。瀏覽器
近年來,智能手機快速發展,移動互聯網業務不斷髮展。人們己經習慣於利用手機完成各類之前須要在電腦上完成的任務,例如網上購物,使用手機客戶端進行網上購物的用戶規模逐年上升,大有超過使用電腦網上購物的用戶規模的趨勢。本文以實際的學校移動項目爲背景,對安卓移動軟件的通常架構設計及其中的關鍵技術進行了深刻探討。
對手機軟件編程人員來講,比較關心的是什麼樣的手機系統更有市場,什麼樣的手機系統擁有更多用戶。當今,佔有絕大部分移動操做系統平臺市場份額的有蘋果學校的IOS,谷歌學校的Android及微軟學校的Windows Mobile 。從2009年以來,Android操做系統成爲了開發者最受歡迎的系統,由於其開源性的特色,開發安卓應用程序軟件具備很好的市場價值,同時安卓系統的手機也被衆多國內外手機廠商青睞,例如國外的三星和國內的華爲、中興、小米等。
安卓開發的另外一個特色是它大部分只須要使用JAVA開發語言就能夠,一部分涉及底層的須要經過JNI使用C/C++語言生成庫文件被使用,這使得開發人員很容易就能夠熟悉它的開發流程,安卓系統是一個徹底開放的平臺,能夠徹底接納第三方軟件,開發者能夠利用網上衆多的開源代碼,開發出本身須要的應用,使得開發者擁有了史無前例的自由發揮空間,Android這幾年井噴之勢和它的迅速佔領市場離不開它的開源性和免費的服務平臺。
現在,3G, 4G網絡正在全國範圍內快速普及,手機產品也正在經歷着變革似的快速發展,手機所能完成的任務也愈來愈多,例如,聽歌、看電影、網上購物和在線支付等,手機的硬件,例如屏幕、CPU, GPU等,更新換代迅速,所以手機軟件研發的快速跟進是形勢所趨。隨着Android平臺的市場份額逐漸攀升,安卓系統下的應用程序的數量和質量都在發生着突飛猛進的變化。由於安卓開源性的緣故,安卓手機開發人員相比其它系統來講能夠更加快捷的開發手機應用,開發者能夠利用他人公佈出來的成果,也能夠利用本身之前開發的成果進行新的開發,這使得手機的開發更爲靈活,工做量大大的減少了,同時用戶在這款開放性的平臺上能夠最大限度的設計和實現本身想要實現的功能。
和前些年每一個學校或組織都須要一個有本身特點的網站同樣,進入移動互聯網時代後,如今的學校和組織很是熱衷於擁有一款專門爲本身學校正制的安卓應用,來達到宣傳或者其它一些目的。設計並實現一套擴展性和方便二次開發的移動客戶端軟件系統擁有巨大的潛力,如今各大學校都有了功能和性能比較完善的安卓應用,例如騰訊QQ手機客戶端、淘寶客戶端,可是普通學校的移動客戶端還並無普及,爲了彌補安卓客戶端的這一短板,咱們依託某學校的實際項目,設計並開發一款擴展性良好,能夠用於二次開發的安卓客戶端應用系統。
在客戶端應用系統的開發過程當中,本人承擔了以下幾部分工做:
(1)與學校人員協商並制定了需求分析並完成了需求詳細文檔的編寫;
(2)獨立完成了功能模塊的劃分和服務器接口的設計;
(3)全程參與了客戶端各個階段的代碼開發與界面設計工做;
(4)主導並參與了應用系統的各個模塊的測試工做;
(5)總結分析出應用系統的一些BUG並進行了修正。
本文主要分爲六章內容:
第1章緒論。系統地介紹了本文所涉及的開發技術基礎知識、本客戶端系統開發的目的和意義,最後介紹了本人在整個開發過程當中所作的主要工做。
第2章介紹了安卓客戶端系統開發相關技術。詳細說明了重點技術知識點,包括它的實現原理與應用場景,介紹了安卓操做系統的發展背景、安卓整體框架的層次設計與安排以及安卓開發過程必需要用到的重要知識點。
第3章移動客戶端軟件系統的需求分析。說明了整個客戶端系統的需求,包括手機客戶端與服務器端接口,認真分析了這些需求後製訂了一系列整個系統的開發步驟。總結並畫出了開發過程流程圖,明確了移動客戶端軟件的各個模塊所須要完成的功能。
第4章移動客戶端軟件系統的設計與實現。根據劃分好的各個模塊,明確了各個模塊的開發流程,設計了各個模塊的實現流程圖、進行了相關的服務器端數據庫設計與服務器端接口的設計,完成了各個功能模塊的開發工做,詳細介紹了重點模塊的開發細節和重點服務器端接口的實現過程。
第_5章移動客戶端軟件測試。介紹了測試平臺的硬件和軟件環境,對移動客戶端系統進行了實際運行測試,獲得了測試結果。
第6章是結束語。對論文進行了工做總結,說明了本文所取得的成果,系統的介紹了本文所完成的工做並展望了進一步可能研究的內容。
Android是一款基於Linux平臺的操做系統「,它是Google學校於2007年11月5日公開發布的。該平臺由四部分組成:應用、界面、操做系統和中間控件,是針對移動終端開發出的一款開放式平臺,因爲其使用了Linux內核,軟件移植將大大下降難度。底層採用Linux內核提供系統的基本功能,應用軟件開發發佈的規則很是簡單,沒有采起像蘋果學校那樣的相對嚴格的條例,容許各個開發學校或者是我的自行進行研發,開發應用程序的語言能夠用Java或者利用JNI使用C/C++進行編寫本地代碼。Android開發平臺和其餘平臺相比具備明顯的優點圈:
(1) 開放性:開放性是Android系統相比其它系統來講最吸引人的特徵。Android系統所具備的開放性可讓不少的手機制造廠商和我的加入Android平臺生態圈中,這樣,手機在Android系統的支持下,硬件飛速發展,應用迅速增多,用戶愈來愈多,應用程序的功能愈來愈新穎, Android系統近年的飛速發展己經使它成爲成熟的開放性平臺。
(2) 不被運營商所限制:Android在國內上市並普及後,手機上網用戶可以簡單方便快捷地經過安卓應用鏈接到互聯網,大大下降了通訊運營商對它的限制。而且隨着W IFI上網熱點愈來愈多,移動通訊網絡的普及與升級,使用戶能夠經過手機應用享受更多互聯網服務。
(3) 豐富的硬件選擇:安卓系統具備開放性這一優點促使衆多手機開發商都來開發安卓系統手機,這也直接促進了一大批手機廠商的發展,例如國內的華爲、中興、小米等。手機硬件所以快速發展,例如高通處理器的更新換代,手機屏幕的發展等,最近,連PC處理器的巨頭Intel也積極的專門爲手機研發多款處理器。目前手機的硬件己經達到了史無前例的水準,用戶也體驗到了更多高質量的服務。
(4) 開發商再也不受到制約:Android平臺擁有的開放特性提供了公平自由的環境,手機廠商不會由於本身規模的大小等緣由而受到任何不公平待遇。這使得手機廠商踊躍加入,也催生了一些新生廠家,例如國內的小米學校。各式各樣的軟件也如雨後春筍通常地出現。雖然過於開放性的特色使得一些不健康應用,例如,色情、暴力、惡意軟件等,沒法從源頭上制約,但能夠經過發佈平臺的嚴格審覈來制約。
(5) 與Google應用程序的兼容:Google學校是互聯網行業的巨頭,Google的業務範圍己經不只僅限於網絡搜索方面,還包括不少其它業務,例如,Gmail郵箱、雲計算、地圖等。Google旗下的一系列優秀的軟件己經擁有了全球很大的用戶羣。Google發佈了Android } Google平臺的絕大部分軟件都有安卓版本,可以在安卓平臺上安裝,給用戶提供了極大的便利條件[6]。
本節介紹了安卓系統的整體框架。Android整體架構如圖2.1所示,從圖中咱們能夠看到,android系統的架構設計爲分層模式,從上到下一共分爲四層。核心操做系統底層、系統支持庫層、安卓應用框架層以及應用和小部件層。
核心操做系統底層:該層主要負責系統相關的最基本的功能,例如內在管理、系統安全相關、電源驅動管理以及一些重要硬件的底層驅動軟件等。Android的核心操做系統底層爲Linux核心,Android底層還須要爲手機等移動端設備中的各個模塊編寫特有的驅動程序來作支持。所以操做系統層包括Linux核心和驅動程序兩大部分。
系統支持庫層:該層爲Android系統的中間件層,該層有庫和安卓系統所須要的運行環境組成。跟之前非Android系統移動設備的嵌入式系統比較,Android的這一層顯得比較清晰明瞭。本層經過C語言的標準庫來實現,是整個Android系統中最底層的庫,能夠被上層調用。這層包括Media Framework, SQLite,OpenGL, FreeType, WebKit等。
在Android中,擁有各類功能的庫和移動設備的系統平臺關係緊密,這些各類功能庫利用中間插件共同工做發揮巨大的做用。Android最初設計時就強調用戶體驗的優先性高於手機性能,這種理念當時是顛覆性的,不過期間和結果證實了這個理念的正確性。硬件一直在飛速發展,有些關鍵硬件甚至一直保持着摩爾定律,隨着硬件性能的飛速增加,手機性能己經遠遠高於最初的設備性能,達到了系統性能和用戶體驗的雙贏。
應用框架層(Framework Application):
應用程序的框架主要功能和目的是爲開發者提供服務。一些包含各類用戶界面程序的控件就處在這層當中,例如,列表(List)、柵格(grids)等。開發人員在開發應用程序的時候,組件能夠在應用程序之間被相互調用,這個特性使得應用開發能夠更加省時省力。例如,應用程序須要顯示一個能夠顯示待辦事件功能組件,而另外一個應用程序己經開發了具備此功能的組件,並對外發布了此組件,開發者能夠直接調用該組件而不用再重複開發。關於組件的功能以及他們的做用原理將會在下一節進行詳細介紹。
應用和小部件層:
該層包括本身開發的或者系統自帶的應用界面以及應用的全部功能。這層是和使用用戶打交道的,所以也十分重要。通常說,一個程序的應用層開發不只會使用JAVA語言來完成,還一部分是用JNI來使用C/C++來完成,這一部分生成動態連接庫以便被JAVA層使用,最後編譯經過後會在Ecfipse中自動生成
安卓安裝包,也就是咱們熟悉的APK文件,這個APK能夠簽名後直接發佈。Android系統直接提供了不少基本的應用程序,如主屏幕(Home),短信息(Messago),撥號((C all)等等,除此以外開發者還能夠利用該層提供的其它應用接口開發出本身的程序,例如UC瀏覽器等。原生Android系統通常內置Google的應用框架,全部新開發的程序也會處於這一層,如Google自己具備的同步功能、Email、地圖和程序員開發的手機QQ、搜狗輸入法等應用軟件。
比較重要的四大組件包括:Activity, Broadcast, lntent Receiver , Service,ontent provider。接下來的內容咱們主要介紹一下它們的基本原理。
Activity(活動):
Activity是一種可視化用戶活動界面。它是咱們應用程序的主要組成部分,一些實現代碼就是以Activity的形式向用戶展現的,它包含界面部分和代碼實現部分,界面部分與代碼部分分離開來,在代碼部分直接選擇顯示那個界面,代碼部分還能夠完成全部咱們想要完成的功能,例如顯示圖片功能、撥打電話功能、地圖定位功能等等。Activity咱們能夠當作是一種可編程的用戶界面,用戶經過在用戶界面觸摸、點擊等發出操做信息,在Activity代碼中能夠監聽並接收這些信號以執行用戶所請求的操做。例如,點擊按鈕跳轉到另外一個界面,顯示圖片,向指定聯繫人撥打電話等。任意一個Activity均可以單獨實現本身的功能,多個Activity能夠互相創建起聯繫,最終一個應用總體是經過一個或多個以Activity爲基類的子類來具體實現應用的各個模塊功能的。Activity的生命週期對於徹底理解Activity的使用方法是相當重要的,Activity生命週期圖如圖2.2所示:
Broadcast lntent Receiver(廣播):
Broadcast Intent Receive:的功能是接收各類己經發布廣播,而且能夠發送廣播。例如,在音樂播放器應用中,音頻文件播放完成後,該功能模塊發送廣播,其它全部關聯它的組件或功能模塊會接收到它所發送的廣播,接收到後自動進行相關的方法,在這個方法中能夠進行任何想要完成的代碼,一個應用不只僅能夠擁有一個廣播,能夠有多個廣播接收器來同時接收多個不一樣功能類型的廣播。每一個接收器都必需要繼承於BroadcastReceiver類。例如本文中客戶端實現雙擊退出應用程序功能時就用到了廣播,該內容會在後面的章節詳細介紹
Service(服務):
Service組件和Activity相似,也是完成一些開發者想要完成的功能,惟一的區別在Service通常不關心界面是如何的,也就是它只完成功能,不完成界面的繪製,它老是長時間的在後臺運行,完成須要在後臺操做的功能。Service的生命週期包括三個過程:服務建立、服務開啓和服務銷燬。Service分爲兩種類型:本地服務和遠程服務,前者用於應用內部,後者主要用於安卓系統內部的應用之間。其進程模型是能夠配置的,這個組件運行在同一進程中仍是不一樣進程下都是能夠的,徹底取決於調用方和發佈方的決定,當服務和服務調用者不在同一個進程的話就須要部署一些通訊機制來保證它們以前的通訊暢通。
Content Provider(內容供給者):
Content Provider主要功能是提供數據等內容給應用程序,使用這個組件時,開發人員須要定義一個繼承自Content Provider基類的自定義類並實例化,而後全部的操做都得使用這個實例化對象來完成,不能直接調用,這個對象在調用內容的時候與內容供給者經過數據相互傳輸造成會話,相互協做完成相應的功能。
Android的系統模塊架構是以組件部分爲基礎的「。Intent(意圖)對組件來講是很是重要的,它能夠當作是組件以前溝通交流的橋樑,也能夠當作是鏈接組件的橋樑。Intent Filter是爲了Intent而設計,它的功能是組件反饋本身能響應或處理哪些Intent請求行爲或請求數據。下面將介紹Intent, Intent-Filte:和組件之間的關係以及它們相互影響工做的原理。Intent(意圖)能夠使用Context.StartActivity()或者Activity.sta}tActivityForResult()來啓動指定的Activity(活動),通常是經過活動的類名來啓動,被啓動的活動能夠調用getIntent()來獲取啓動者的Intent。啓動者和被啓動的活動能夠經過putExtra()和getIntent().getStringExtra()等方法進行界面之間的參數傳遞;Intent的應用很是普遍,例如,從一個應用界面跳轉到另外一個應用界面,只須要使用Context.StartActivity()而後指定要啓動的活動的類名就能夠了。Intent對象還經常使用於發送接收廣播時的情形,例如在應用接收廣播後會自動調用廣播類的onReceive0方法去執行,這時Intent對象也會傳遞過來。Intent Filte:即意圖過濾器,它是用來描述指望可以響應什麼的Intent過濾,經過這個設計模式,全部的組件都經過系統核心模塊來進行中轉,組件之間能夠通過Intent Filte:過濾後再接觸,不須要直接接觸,使結構更加清晰。多個Intent Filte:構成一個不一樣的響應能力集合來完成爲意圖提供多個過濾。在沒有定義任何Intent Filte:的狀況下,Intents在激活組件的時候就必須得提供該組件的名稱、意圖、意圖過濾器和系統核心之間構成的關係如圖2.3所示:
從圖2.3能夠總結出它們的基本工做原理,應用將Intent傳遞給系統核心層,系統核心層接着經過Manifest文件或者代碼的方式獲取到意圖過濾器,從意圖過濾器裏讀取到能夠響應的意思並進行下一步的操做。
Intent傳遞實現
一個應用每每擁有多個界面,各個界面每每經過Intent來交流,在上面的章節中咱們己經瞭解到了經過Intent的putExtra()方法等能夠在不一樣的活動界面(Activity)之間進行傳參等溝通交流。這裏將介紹Intent之間的傳遞原理。Intent的傳遞原理及傳遞過程如圖2.4所示:
由上圖2.4可知,Intent流程是首先調用Context類的StartActivity方法來建立意圖對象,接下來系統自動執行Instrumentation類的execStartActivity方法。Instrumentation類的做用是調節整個應用當中的全部活動界面(Activity ),充當應用程序的管理員的角色,其execStartActivity方法的做用是根據上面執行StartActivity方法後傳遞過來的Intent來啓動相應的活動界面,並且Instrumentation對象能夠經過RPC方式把調用context StartActivity傳遞給ActivityManagerService}
系統核心層是在虛擬機上運行的,與通常的Service不一樣的是,系統核心層是在底層服務,是不可見的。其主要做用就是對Android的某些關鍵事務提供和服務。ActivityManagerService進行Activity調度過程以下:因爲PackageManagerService服務有整個應用以及應用的各個組建的所有信息,Intent經過PackageManagerService傳遞而後和當前Intent Filters匹配,若是匹配成功則可以獲得與Component有關的信息,將這些信息傳給ActivityManagerService後即可啓動Activity,完成Intent傳遞
儘管啓動Activity比較複雜,過程當中會調用不少服務,顯得代價比較大,可是這些調用並不會在循環中重複出現,與其對應用效果的提升相比,這些處理仍是利遠遠大於弊的。
Android爲動態形式。應用程序啓動後,其中的各個組件相互調用,全部的數據也都變爲了更加方便地瞭解應用啓動後的動態過程,引入了進程與線程。進程用Activity, Service, ContentProvider和BroadcastReceiver組件在系統最底層構建了運行環境,正常狀況下同一個應用的全部組件在一個進程內運行,同時,開發者也能夠自行配置。用戶安裝新的Android程序時會獲得一個用戶ID,而且不一樣的Android程序能夠共享相同的用戶id,這樣就可互相訪問程序之間的信息,能夠共享JVM而且在同一個進程中運行。正常狀況下,一個Android應用的全部組件都是由一個進程的主線程管理的。新線程是在有某些複雜耗時間且須要等待的任務須要執行時建立的,多線程操做可讓系統在等待查詢數據庫等操做時執行其它操做來保證應用的性能。
界面是用戶與程序間交互的媒介,界面與客戶體驗有着直接的聯繫。若是開發者將總體佈局設計與界面資源相結合,並結合接口設計等功能,就能夠設計出友好簡潔的界面。界面控件樹型結構如圖2._5所示:
由上圖可知,圖的頂端是View Group,是一個總控件,其能夠衍生出View Group以及View,衍生出來的爲子控件,父控件管理子控件的位置、面積,而且爲其分配任務。樹形界面控件具備結構層次、控制方式簡單明瞭等優勢。在程序開發的過程當中,開發者會加入不少源代碼之外的文件,並且可以支持多種類型的資源文件,例如圖像,音頻等,Android可以支持多種類型的文件。因爲這些優點,樹形界面控件現在被普遍應用。但其有着傳播時間較長等自身的不足,使得操做的效率變低[m。可是與優勢相比,這些缺點仍是值得的。
本章對涉及到的安卓基礎知識進行了剖析,包括了安卓系統中的重點技術、使用場景特色以及重點構架和模塊。介紹了安卓的工做原理以及開發中須要用到的相關技術進行了詳細講解,爲後面章節的具體設計與實現做了基礎鋪墊。
網絡的使用對人們來講己經很是廣泛,因爲手機終端具備方便的可攜帶性,使得移動網絡具有了Pc網絡所沒有的天生優點,深受廣大人們喜好。如今智能手機全面普及,移動互聯網時代己經到來,每人一部智能手機己經再也不是空話,面對如此龐大的用戶羣,移動客戶端軟件的開發顯得尤其重要。
Android是第一個能夠稱爲真正開放和完整的爲移動終端設計的移動軟件平臺。做爲移動客戶端,與服務器端接口交互通訊是很是重要的一個方面。咱們如此迅速的跨入移動互聯網時代與Android系統的迅速普及密不可分。移動互聯網時代開發出的移動應用有兩種模式:第一種是本地應用,這類應用安裝在手機上,可能須要聯網操做,但不須要開發配套的服務器接口,例如一些遊戲等等;另外一種是網絡客戶端,這類應用不只僅須要開發本地的應用,還要設計配套的服務器端接口,而且這類應用每每須要聯網服務,在這種模式中,開發人員既要掌握像Android這樣的移動開發技術還要掌握開發服務器端API方面的技術,本文所設計實現的移動客戶端系統就屬於這種模式。使用移動客戶端能夠完成一些電腦上沒法完成的功能,好比搖一搖功能、隨時隨地拍照上傳功能等等。而且移動客戶端的使用環境普遍,無論是在公交車中站立仍是在餐廳等餐,均可方便的使用。移動客戶端的優勢和做用還有不少,在此不一一列舉。 隨着手機的硬件配置的不斷髮展,如今主流手機的硬件配置包括存儲空間和運算能力甚至能夠媲美通常PC機,所以客戶端軟件所受到的限制就愈來愈少了。目前各式各樣的手機軟件早己鋪滿了手機界面,開發者開發出的客戶端應用的內容和功能更加豐富,界面更加人性化,性能更加完善,大大的豐富了移動設備的功能,也使用戶享受到了更加溫馨的服務。
從軟件工程的角度來講,客戶端的開發整體上包括項目需求分析,項目設計,項目審覈,項目開發,項目測試這幾個方面,下圖展現了移動客戶端開發的所有流程:
此設計的目標是開發一款符合學校正制需求的移動客戶端系統,客戶端的網絡需求能夠由中國移動運營商或者WIFI提供網絡支持。
軟件運行環境說明:
手機端:選用Android系統的手機或者平板電腦,要求Android2.0以上操做系統,硬件須要攝像頭,其它硬件保持正常,可以鏈接到互聯網。
服務器端:選用Windows7操做系統,保證必定的存儲空間,安裝有MySQL,JAVA和Tomcat等運行環境,可以正常訪問互聯網。
(1) 軟件特徵:本軟件面向的是使用Android系統手機或平板電腦而且可以正常訪問互聯網的特定用戶人羣。
(2) 假定和約束:本客戶端的開發工做是基於假定手機端和服務器端硬件無缺,系統運行正常,並具備必定存儲空間。
通過學校人員和開發人員仔細協商後,本客戶端的用戶人羣定爲學校內部員工以及學校的客戶。學校員工及學校客戶須要註冊登陸才能使用,按照學校要求,每一個員工及學校的產品等都綁定一個惟一的二維碼,經過掃描能夠看到他們的信息,員工和客戶應該可以隨時隨地發表狀態或拍照上傳並分享,而且其餘人能夠評論此狀態以方便員工之間、客戶之間或者員工和客戶之間能進行溝通,學校員工可以發佈通知或公告以便最新消息的擴散,定位及導航功能使得客戶可以方便的找到學校所在地,撥打電話功能使得客戶能直接和學校值班客服進行電話溝通。綜上,本移動客戶端的需求定爲以下幾個方面:
(1) 須要有登陸註冊模塊;
(2) 須要有二維碼條形碼掃描識別模塊;
(3) 須要有相似微信朋友圈那樣的能夠分享狀態和照片及評論的模塊;
(4) 須要有發佈通知公告的模塊;
(5) 定位及導航模塊;
(6) 撥打電話模塊。
(1) 跟學校人員協商進行需求分析;
(2) 肯定開發工具和服務器端開發環境;
(3) 肯定客戶端和服務器端接口編寫的規範;
(4) 客戶端軟件界面設計;
(5) 服務器端數據庫和接口的編寫;
(6) 客戶端和服務器端鏈接測試;
(7) 客戶端各個模塊的編寫;
(8) 軟件測試;
(9) 與學校交接。
用戶使用應用程序的流程以下圖所示:未註冊的用戶首先經過註冊,而後登陸應用,對於己經註冊的用戶,則直接登陸便可使用。
本章介紹了本課題的需求分析,說明了客戶端系統的做用,並分析了現有的客戶端開發的流程,而後根據本課題的具體需求,制定了本客戶端的開發流程,並把需求的各個功能劃分紅了更加直觀的模塊。
安卓系統應用是由不一樣組件結合起來的,組件內部高內聚,組件之間的關係是低禍合的,並且軟件的劃分邊界不清晰。在其它軟件開發過程當中,程序內部都有本身方法來分解功能,這些方法並無統一的標準。軟件之間的通訊也沒有統一的標準,須要交互時候必需要獲得雙方的各項信息才能夠。而在安卓系統中,底層核心能夠爲全部的應用程序進行信息存儲,識別,通信,起到了爲組件搭橋牽線的做用,這樣組件之間交互就沒必要獲得對方的具體信息,沒有底層核心,它們之間是不能進行交互的。具體狀況以下圖所示。
因爲安卓應用程序具備上述特色,本客戶端的設計原則以下:
(1) 對於應用的層次要嚴加思考,層次要劃分清楚,組件之間低禍合;
(2) 明確各個組件的功能,分工清晰以便組件的複用與擴展;
(3) 對於進程與進程的消息傳遞,線程與線程的通信要合理設計;
(4) 應用界面要友好,用戶使用方便,易於上手。
(5) 在考慮應用的設計時,應該從軟件平臺考慮,衡量其它應用以及HomeScreen的要求。例如可以使其它軟件使用的服務應提供相應的接口。
(6) 軟件應考慮到被打斷等特殊狀況,例如,在運行過程當中有其它應用的通知、接到電話,短信等,所以應作監聽功能。
客戶端軟件除了安裝在安卓終端,包括平板電腦以及智能手機上的移動客戶軟件以外,還有數據庫以及服務器端系統。移動客戶端與數據庫之間經過服務器相互相互,移動客戶端經過網絡鏈接到服務器,支持無線網絡和移動網絡。服務器與對應的數據庫相連,起到橋樑做用。具體關係以下圖所示:
根據上一章中需求分析後,咱們把客戶端軟件分紅幾個模塊,模塊的詳細設計以下圖所示:
基於安卓客戶端開發工具主要是Eclipse,開發環境由JAVA系統環境和Android SDK環境組成。開發環境的搭建過程以下:
(1) 配置JAVA運行環境。下載安裝JDK。官網網站是: http://www.Java.com/en/download/chrome.jsp?locale=en,下載界面以下
下載安裝完成後仍須要配置開發用的計算機的環境變量來進行JAVA開發。
配置環境變量主要包括三個方面:JAVA的安裝地址(Home變量),JAVA的可 運行程序的地址以及JAVA的類地址變量(CLASSPATH )用鼠標右擊「計算機」,選擇「屬性」,而後選擇「高級」,再選擇「環境變量」,再選擇「系統變量」,最後選擇「新建」。
在新建窗口中的「變量名」處填寫「Java_ home",「變量值」填寫JAVA的安裝主目錄路徑,例如本機爲:"C:\Program FilesUava\jdk1.6.0",最後點擊「肯定」,這樣JAVA的HOME變量(Java_ home)就設置完成了。
下面簡單介紹一下「classp ath」變量的配置。選中「系統變量」添加或編輯"classpath」變量,變量名咱們設置爲「CLASSPATH",而後在「變量值,,中填寫JAVA的lib庫所處的地址,例如本機是:"C:\Program FilesUava\jdk1.6.0\jre\lib",以下圖所示。
如今能夠進行「path」變量的配置了。與上面「classp ath」變量設置時類似,「變量名」輸入框中填寫在的地址,例如本機是:"path"「變量值」輸入框中填寫JAVA可運行程序所「C:\Program FilesUava\jdk1.6.0\bin」。
JDK的環境變量己經配置完成,須要判斷環境變量的配置成功與否,在其C cmd)窗口中輸入:+.lava -version」來輸出JAVA安裝版本,若是正確輸出安裝版本信息,例如顯示以下圖信息,說明JDK己經安裝並配置成功。
第二步,安裝Android運行環境。在Android Developers下載Windows下的安卓SDK壓縮包,並用上面配置JDK一樣的辦法把安卓SDK中TOOLS的路徑添加到」path「變量中。使用在CMD終端中輸入「Android -h」來檢測AndroidSDK安裝成功與否。
第三步,配置eclipse以使用它進行Android開發。打開Eclipse配置接口,進入Add New software界面,而後輸入ADT下載源,如圖:
肯定返完成以後,還須要把Android SDK的路徑配置好,如圖
本項目開發服務器端使用的是經典的Tomcat+MySQL,開發工具是Eclipse,服務器端使用的語言是JAVA,主要的環境搭建工做就是下載Tomcat,MySQL, JAVA,Eclipse並在服務器電腦上進行安裝並配置環境變量,這些環境變量的配置過程與方式與上一節相似,在此再也不贅述。
首先是軟件小圖標的設計,也就是安裝在手機上後在手機桌面上顯示的那個圖標,這個圖標要考慮到兩方面,一是要體現此客戶端的主體風格,二是也能夠體現出學校的元素。而後是軟件自己的界面設計,安卓的界面採用的是Xml,經過xml中的樣式總局,咱們能夠設計出各類用戶界面,和學校美工人員協商後肯定的客戶端主界面以下圖所示。
微圈登錄界面:
微圈註冊界面:
微圈主界面:
微圈數據庫後臺:
數據庫後臺 1
數據庫後臺2
當用戶打開客戶端軟件直接跳到登陸界面,在用戶輸入用戶名和密碼並點擊登陸按鈕後,客戶端會把當前輸入的用戶名和密碼上傳到服務器,服務器查詢數據庫以驗證用戶的合法性,若是用戶名和密碼皆正確則進入軟件主界面,不然提示登陸失敗並引導用戶進行註冊。 用戶進入主界面後,能夠選擇任意的功能進行操做,如發表狀態、評論等。
根據軟件客戶端的業務邏輯,設計出的實現類以下圖所示:
本客戶端系統主要包括這幾個重要的類:
(1) HomeActivityjavaIndexActivityjava
(2) FriendActivityjava
(3) Message.java
(4) comment.java
(5) Photo.java
(6) PersonalActivityjava
(7) ZhihuiActivityjava
(8) Communicate.java
(9) Navi.javao
類HomeActivity.j ava實現了對安卓Activity類的繼承,主要顯示用戶登陸成
功後的界面,展示三個菜單以讓用戶進行點擊選擇,這三個菜單分別是:主頁,微圈和我的中心。類IndexActivityjava主要實現了首頁要顯示的功能,主要顯示了學校logo,以及掃一掃功能,溝通智慧之窗功能等。類FriendActivityj ava主要實現了朋友圈功能,包括上拉刷新功能,下拉加載更多功能,它包括三個子類:Message.java} comment.java和Photo.j ava,這三個類分別實現的功能是發表狀態,發表評論和拍照並上傳照片功能。類ZhihuiActivity.java主要實現了發表通知公告、定位導航等功能,它包括了兩個子類:Communicate.java和Navi.java,分別完成了發表通知公告等功能和定位導航功能。把各個功能劃分紅具體的功能模塊類,有助於系統的維護和功能的擴展。
根據學校人員提出的具體軟件需求,咱們設計出了系統的數據關係,數據庫咱們選用的是開源的MySQL。數據庫保存在服務器端。用戶表user,以下表所示:表4. 1用戶表
字段 |
類型 |
默認值 |
是否主鍵 |
是否自增 |
說明 |
Id |
int |
Not NULL |
是 |
是 |
索引ID |
name |
varchar |
Not NULL |
否 |
否 |
否 |
Password |
varchar |
NULL |
否 |
否 |
密碼 |
Sex |
varchar |
NULL |
否 |
否 |
性別 |
Phone |
varchar |
NULL |
否 |
否 |
電話 |
|
varchar |
NULL |
否 |
否 |
郵箱 |
Address |
varchar |
NULL |
否 |
否 |
住址 |
朋友圈發表的狀態表xinjiaoliu,以下表所示:表4. 2狀態表
字段 |
類型 |
默認值 |
是否主鍵 |
是否自增 |
說明 |
id |
int |
Not NULL |
是 |
是 |
索引ID |
time |
date |
NULL |
否 |
否 |
發表時間 |
des |
varchar |
NULL |
否 |
否 |
發表內容 |
pic_path |
varchar |
NULL |
否 |
否 |
圖片路徑 |
朋友圈發表的評論表reply,以下表所示: 表4. 3評論表
字段 |
類型 |
默認值 |
是否主鍵 |
是否自增 |
說明 |
id |
int |
Not NULL |
是 |
是 |
索引ID |
srcid |
int |
Not NULL |
否 |
否 |
外鍵,對應回覆的狀態的ID |
content |
varchar |
NULL |
否 |
否 |
評論內容 |
time |
date |
NULL |
否 |
否 |
評論時間 |
uservarchar |
NULL |
否 |
否 |
發表評論的用戶 |
|
字段 |
類型 |
默認值 |
是否主鍵 |
是否自增 |
說明 |
在Android開發過程當中,安卓的類包表示爲Android.*形式,例如包含一些問網絡的類和接口的類包表示爲Android.net,其中一些比較關鍵的類包主要有:高層程序模型與安卓應用基本運行環境的提供者(app包);主要實現訪問或發佈設備上所包含的各類數據類包(content包);操做數據庫的類包(database包);圖形繪製與操做類包(graphics包);定位和相關服務的類(location包);執行對多媒體操做和管理的一些接口的類包(media包);包含一些訪問網絡的類和接口的類包(net包);提供系統最底層的一些基本服務操做類包(os包);OpenGL工具包(opengl包);基礎的UI框架類包(view包);完成對Android各類數據內容的訪問的類包(provider包);與電話功能相關的服務的類包(telephony包);安卓系統基本功能類包,例如訪問或者更改系統時間等(util包);操做手機自帶瀏覽器操做的接口的類包(webkit包);顯示在應用程序中的各類用戶界面的基本元素的類包(widget包)。 Android有一個很是核心的特性,應用程序能夠利用其它應用程序的元素.也就是說應用能夠很是簡單地直接調用其它應用的代碼或模塊。例如,若是應用程序須要撥打電話的功能模塊,可是咱們不須要從新開發一個撥打電話模塊,只須要找到己經開發好而且開源的功能模塊而後直接使用它就能夠了,開發人員能夠直接調用該己經開發好了的模塊,大大節省了開發的人力和物力,而且縮短了開發週期。安卓應用程序在運行的時候須要系統來調用或者初始化一些主要組件。這些主要的組件己經在第二章中的第二節進行了詳細的介紹。
當用戶打開軟件時會首先進入登陸界面,用戶能夠使用己存在的用戶名密碼進行登陸,若是是第一次使用則須要進入註冊頁面去註冊新的用戶。登陸流程圖以下圖所示:
登陸界面以下圖
須要注意的是由於是自動進入登陸界面的,因此在進入登陸界面以前的那個啓動界面SplashActivity中要先打開主頁Activity,也就是HomeActivity,而後在登陸界面LoginActivity中執行完和服務器的交互後,把登陸是否合法的結果再傳回HomeActivity。從一個界面進入另外一個界面的代碼以下:
Intent mIntent=new Intent(SplashActivity.this, LoginActivity.class); startActivity(mIntent); |
在登陸界面中咱們使用多線程機制與服務器端進行交互,登陸的時候爲了避免阻塞主線程(UI線程),須要把些耗時並阻塞主線程的操做放在另外一個線程中處理,所以登陸採用異步處理是不可避免的。咱們使用了AsyncTask來進行異步處理,它是android提供的輕量級的異步類,咱們在開發的時候定義一個直接繼承AsyncTask的類,而後把全部須要異步處理的操做放在這個類實現,這個類能夠經過AsyncTask類自帶的接口把當時執行的任務的反饋給主線程,以便通知主線程進行相關的操做。它的優勢是簡單輕量、使用快捷,而且過程可控。如下這兩個方法是最重要的,也是不可缺乏的:
(1) doInBackground(par...)。運行於後臺的此方法,也就是在非主線程執行,在這裏主要完成一些和服務器交互、圖像處理等比較耗時的操做,處理完成後把結果返回。在這裏不容許直接更改主線程(UI線程)的界面元素,不然會拋出異常。只能經過自帶的Progress()等方法通知主線程進行UI的更新。
(2) onPostExecute(Result)。該方法通常須要傳入參數「Result",這個參數就是上面doInBackground(Par})方法中返回的結果。在這裏主要進行耗時操做後獲得的結果的處理。此方法在主線程執行,所以是不能在這裏執行費時操做,不然會阻塞主線程,出現卡頓現象。下面三個方法是能夠選擇性使用,使不使用取決於你想要實現什麼樣的功能:
(3) onProgressUpdate(Progressw)。當在doInBackground(Par})方法中須要與主線程界面交互,例如顯示當前任務執行進度時,進度狀況的顯示就是在這個方法中實現的,此方法由於要操做主界面,因此運行在主線程
(4) onPreExecute()。此方法是在doInBackground()方法開始以前自動調用的,也就是在所須要完成的任務執行以前調用的,能夠在這裏完成一些準備操做,例如進度條初始狀態的設置等等。
(5) onCancelled()。當用戶執行取消操做時系統自動轉到這個函數中執行接下來的代碼。
在咱們使用AsyncTask類進行異步處理的時候,有些規範是必需要注意的。AsyncTask類的對象必須在主線程中建立使用,而後再調用execute方法來進入到異步處理操做,且該方法也必須在主線程中進行調用使用,除了該方法外,AsyncTask類的其它方法不能夠手動調用,例如咱們在任何狀況下都不能夠直接調用onPostExecute(Result)方法來執行結果處理操做。在本客戶端中,與服務器進行交互的時候咱們都使用了AsyncTask進行異步處理,下面咱們以登陸爲例,核心代碼以下所示:
//登陸系統 class MyTask extends AsyncTask<String, String, JSONObject> { @Override protected void onPreExecute(){ // TODO Auto-generated method stub super.onPreExecute(); @Override protected JSONObject doInBackground(String... params) { Map<String, String> map2=new HashMap<String, String>(); map2.put("name_ c", params[0]); map2.put("password", params[1]); try{ retStr=new JSONObject(NetTools.sendPostRequest(url, map2, "utf-8")); }catch (Exception e){ e.printStackTrace(); } return retStr; @Override protected void onPostExecute(JSONObject result) { try JSONArray rs=result.getJSONArray("result"); String code=result.getString("code"); if(code.equals("1」)) { //代表登陸成功,進行登陸後操做 else { //代表登陸失敗,進行登陸失敗後的操做 DisplayToast(」登陸失敗!」 } }catch(JSONException e) e.printStackTrace(); |
當咱們使用以下代碼時,上面的代碼被調用,並在後臺進行,不阻塞UI主進程。
MyTask login=new MyTask(); login.execute(username,password);
|
上面的代碼把用戶名(username)和密碼(password)做爲參數傳入,這兩個能在方法protected JSONObject doInBackground(String... params)中獲得,如params [0]就是咱們傳入的username, params[1]是咱們傳入的password o在方法doInBackground()中進行與服務器端的交互,具體發送和接收數據在類NetTools中的方法sendPostRequest()中實現,該方法的關鍵代碼以下所示:
|
在本客戶端中,咱們使用Post方式向服務器傳送數據,包括文字(英文,中文等)、文件等,並且數據對用戶不可見。服務器端接口一直監聽請求,若監聽到數據傳輸請求則進行接收數據等操做,詳細代碼解釋會在下面的章節進行介紹。對應的服務器端的登陸流程以下:
使用了異步處理不會阻塞主UI線程,使得應用能夠顯示人性化的提示信息,不會出現卡住界面的狀況,以下圖表示正在登陸:
註冊功能與登陸功能的流程十分類似,不一樣之處在於:註冊上傳的參數比較多,不僅包括用戶名和密碼,還包括用戶的其它一些信息,如郵箱、聯繫電話、住址等,並且服務器端也有一些不一樣,登陸是查詢以驗證合法性,而註冊是把
客戶端上傳的信息插入到數據庫中,因爲上面己經講述了登陸的過程,註冊的
相關技術細節這裏再也不進行陳述。
登陸時還有一個記住密碼功能,完成該功能使用的是SharedPreferences類,
SharedPreferences是Android中最方便快捷而且容易使用的數據存儲技術,實際
上SharedPreferences處理的就是一個key-value(鍵值對)。SharedPreferences常
用來存儲一些輕量級的數據。使用如下代碼保存數據:
|
當下次登陸時要檢查是否己經成功登陸過,若是有保存了的用戶名和密碼則把它們取出來並自動填寫到輸入框中,使用如下代碼取出己保存的數據,這樣就簡單的完成了記住用戶名和密碼的功能:
|
朋友圈功能主要是爲了方便溝通與交流,要求能發表狀態,針對某個狀態能夠回覆評論,還要求能發表圖片狀態。朋友圈的結構以下圖所示:
朋友圈的主體界面以下圖所示
發表狀態時能夠直接在界面的上部分輸入並點擊發布,一樣咱們仍然使用AsyncTask進行異步處理,首先判斷用戶的輸入是否爲空,若是爲空提示用戶容不能爲空,若是不爲空就開始異步與服務器交互,把用戶發表的狀態、當前時間、用戶名保存到數據庫中,保存成功後告知客戶端進行一次刷新。針對某個狀態發表評論時,客戶端首先要獲得這條狀態的ID以便和狀態關聯起來,而後用戶輸入評論後把這條狀態的ID,評論內容,當前時間和用戶名用一樣的方法發送到服務器,在服務器端把這些數據插入到數據庫中,而後把成功與否的結果返回給客戶端。在上圖中,圖片都是以縮略圖的形式保存的,這樣提升了加載速度也減小了圖片佔用的空間,當咱們點擊圖片時,圖片會放大成原來尺寸方便用戶的觀看,使用的方法很簡單,由於咱們己經獲得了圖片的路徑,在監測到點擊圖片事件吧,把這個圖片對應的路徑地址傳給要顯示大圖片的Activity,使用mIntent.putExtra("pic_path", pic_path);在這個Activity根據路徑正常顯示便可。發表圖片狀態的時,要首先打開手機自帶的相機,打開相機的代碼以下:
|
拍照完成後顯示該照片,而且容許用戶輸入狀態,界面以下圖所示,點擊發布後客戶端把圖片和狀態發送到服務器,在服務器端成功接收到圖片後,根據當時時間建立一個惟一的圖片名,並生成該圖片的保存路徑,而後把圖片的保存路徑和狀態都插入到數據庫表中。最後把處理結果發送回客戶端,若是發佈功能客戶端自動刷新一次。
此模塊是設計給用戶直接用客戶端向學校客服人員提問問題的。這部分包括提問問題與全部問題的顯示兩部分,同時在設計上也加入了下拉刷新與上拉加載更多。包括提問的問題內容和提問時間。提問界面以下圖所示。
這模塊的實現方法跟上一節中的朋友圈中的發表狀態的實現技術和方法都差很少。主要也是用戶填寫要求的內容後進行異步處理與服務器端交互,把數據發送到服務器端,在服務器端把這些數據插入到數據庫中,成功插入後通知客戶端進行刷新操做。上拉鬆手刷新是必須,由於用戶隨時隨地都有可能在發表狀態,咱們須要一個方便的快速刷新的機制,上拉而後鬆手進行刷新無疑是解決這個問題的最佳方案,下拉加載更多一樣也是不可或缺的,由於用戶發表的狀態的數量一直在不停增長,若是每次進入都一次性的把全部的狀態所有加載出來就一個不可想象的事情。爲了一次性解決上面的問題,咱們設計了一個上拉刷新,下拉加載更多的控件,控件的原理圖以下所示:
手機屏幕的大小和上圖中的Container View的大小同樣,而Heade:和Footer能夠想象成是超出屏幕上下邊界的部分,經過設置Header和Footer的padding屬性來使Header和Footer兩個部分強制超出屏幕外,例如設置Header的padding=-_50,那麼它就會處於屏幕最頂端的上部,且距離頂端_50個單位,所以日常不拉動的時候是不可見的。當手機監聽到下拉動做時,系統會自動調用相應的方法來移動佈局,也就是使整個佈局向下滑動,Header也會下滑,由於它是超出屏幕外的,這樣它就會顯示到屏幕上,上拉正好與下拉相反。由於下拉刷新上拉加載更多的功能在多個模塊中都要使用,咱們把它抽象成一個接口以便後面的擴展和修改。以下所示這個接口包含的全部方法:
接下來咱們還須要定義一個實現了上述IPu11ToRefresh接口的基類:Pu11ToRefreshBase。它繼承自LinearLayout類,若是你想實現一些自定義的功能,例以下拉刷新功能,只須要建立一個繼承這個基類的新類,而後在這個新類中把一些方法根據本身的須要進行從新實現就能夠了。這個類主要實現如下內容:
(1) 處理。nInterceptTouchEvent()和onTouchEvent()中的事件:好比有下拉操做時,當內容的View(好比ListView)正處於屏幕最頂部,此時咱們必須截斷這個Touch事件,而後使用move事件就會把後續的事件傳遞給onTouchEvent()方法中,而後再在這個方法中,咱們根據手指滑動的距離再總體移動整個視圖View)。
(2) 負責建立Header, Foote:和Content View:在構造方法中調用方法去建立這三個部分的View,派生類能夠重寫這些方法,以提供不一樣式樣的Header和Footer,咱們使用createHeaderLoadingLayout C)方法來建立「頭視圖」C Headerlayout),使用createFooterLoadingLayout C)方法來建立「腳視圖」C Footer layout)
(3) 設置各類狀態:實現這樣的下拉刷新功能須要監聽到各類狀態,例如:下拉、上拉、鬆手、是否正在加載等等。狀態會隨着用戶的操做進行改變,例如用戶手拉動的距離超過必定的值時,狀態會從鬆手不完成任何操做轉制到鬆手進行刷新狀態。而後「頭視圖」或者「腳視圖」會根據當前的狀態來顯示當前的應該顯示的界面。
onInterceptTouchEvent()和onTouchEvent()這兩個方法是必需要進行重寫的,由於它們能完成很重要的功能,例如完成上下滑動等事件處理等功能。上拉刷新的主要思路就是在檢測到向下拖動到必定距離並鬆手後客戶端向服務器端發送更新內容請求,服務器接收到請求後查詢一下數據庫,並把最新的數據發送回客戶端。下拉加載更多的思路是設置一個限制數,好比說是巧,那麼第一次進入的時候服務器只傳遞巧條數據給客戶端,下拉一次後服務器再傳遞另巧條數據給客戶端,而且下加載的過程的爲了美觀還得在最下面,也就上述的Footer顯示「正在加載,請稍候」相似這樣的提示語,所以它也須要異步處理,也就是須要用到上面己經提到的AsyncTask在實現的過程須要用到適配器BaseAdapter,這個適配器的做用就是把每一項動態的逐一的放到一個ListView中,這個ListView必須是咱們自定義的一個ListView,它須要繼承上面提到的Pu11ToRefreshBase類,由於咱們要實現上拉刷新等功能,假設咱們把這個自定義的ListView命名爲MyListView。那麼在使用時須要在layout的界面xml中使用以下語句聲明使用的是咱們自定義的控件
而後在界面類中使用setAdapter()方法把這個ListView和咱們自定義的適配器adapter綁定,用戶所發的每一條信息就能夠當作是一個ListView的item項,這個item也使用一個獨立的界面xml來表示,重點就是在適配器中把這些item項動態的加入到ListView中,在咱們自定義的適配器中使用LayoutInflater類的inflate方法就能夠獲得item的xml,並使用這個xml的元素,假設這個item的xml的名字是activity_nongguanlist item.xml,這個xml包含四個元素:標題(title用戶名(name ),時間(time ),狀態(state ),在適配器的getView方法中使用以下代碼就能夠動態的綁定item到LIstView中。
convertView=mInflater.inflate(R.layout.activity_list item, null);
String title= (ImageView)convertView.findViewById(R.id.item_title);
String name= (TextView)convertView.findViewById(R.id.item_name);
String time=(TextView)convertView.findViewById(R.id.item_ time);
String state=(TextView)convertView.findViewById(R.id.item_states);
上拉刷新如圖所示:
定位導航的實現藉助的是百度地圖的Android導航SDK,這個SDK是免費的,而且接口能夠無次數限制的使用。首先要先申請密鑰和下載相關SDK包和一些庫等,具體使用和配置開發過程能夠參考百度導航SDK官方網站的說明和
教程:http://developer.baidu.com/map/index.php?title=android-navsdk o
掃一掃在各個手機客戶端中都常看到。本客戶端二維碼掃描使用的是目前十分流行的開源項目(Zxing項目,由Google主導),整個項目工程及相關例子的下載地址是:http://code.google.com/p/zxing/。二維的掃描矩形四個角是用Canvas類的drawRect方法畫的,drawRect的原型是drawRect(float left, float top, float,right, float bottom, Paint paint)。掃描矩形框中上下掃描的掃描線也是一樣的辦法畫的,不過參數座標需在設定的頻率內不刷新,就實現了線上下位移的效果了。二維碼掃描界面以下圖所示:
咱們實現了自動打開相機自動聚焦進行掃描二維碼,掃到二維碼後解碼獲得此二維碼錶示的內容。二維碼大致上有如下特色:
二維碼能存儲漢字、數字和圖片等一維碼所不能承載信息,所以它能夠應用在更廣大的領域。由於二維碼掃描功能須要調用手機自帶的相機,在AndroidManifest.xml中要聲明上使用camera權限,
在AndroidManifest.xml文件中加上代碼:
<uses-permission android:name="android.permission.CAMERA" />
就聲明瞭權限。掃描流程以下圖:
在安卓應用中實現撥打電話的功能是很容易,在應用中指定好電話號碼,而後經過代碼調用手機自帶的撥號功能,把號碼傳遞過去,就實現了自動撥號功能,自動撥號在一些團購網站等服務性網站客戶端中比較經常使用,它的做用就是最大程度方便用戶的使用,使得用戶不用先記住客服電話,而後手動打開撥號應用並輸入己記憶的電話號碼進行撥打。使用以下代碼能夠自動撥打指定電話號碼,假設咱們的目標電話號碼是100860
//傳入服務,parse()解析號碼 Intent intent=new Intent(Intent.ACTION_ CALL, Uri.parse("tel:」+「10086」); //通知activtity處理傳入的call服務,開始撥號startActivity(intent);
|
最後咱們介紹了安卓軟件中很是經常使用的功能:連續點擊再次退出應用程序。這裏包括兩個部分,一個退出應用程序的方案,二是連續點擊退出。退出應用程序最簡單是使用finish()方法關閉本Activity,可是針對多個界面的應用來講這樣會帶來一些問題,須要咱們在具體實現的時候時時刻刻記得最後保證每一個Activity都得關閉,這些作開發起來會增長必定的勞動和時間成本的,咱們採用的方案是經過廣播事件去一次性關閉全部的Activity,首先就是創建一個父類,讓全部的activity繼承這個父類,這樣就不用每一個Activity都去註冊以接收廣播,只要在父類註冊接受就好了。在父類的Resume()中使用方法registerReceiver()註冊廣播,當接收到請求時,在父類的新建的類roadcastReceiver()中執行方法finish(),這樣全部的Activity就都關閉了,由於全部的Activity都繼承自這個父類Activity。而後在全部子Activity中監聽返回按鍵,當在設定的時間內連續兩次點擊時就發佈廣播。連續雙擊退出應用程序的流程圖以下所示:
無論是登陸註冊,仍是發表評論都須要服務器端接收客戶端發送的數據並進行處理,執行數據庫操做也是在服務器端進行的。每個客戶端的功能都對應一個服務器端的一個JAVA類文件。且這些類名須要在web.xml中進行類名和類位置的映射,例如登陸類名爲:Login,在包login裏,須要以下映射:
<servlet> <servlet-name>Login</servlet-name> <servlet-class>login.Login</servlet-class> </servlet> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/Login</url-pattern> </servlet-mapping>
|
這樣在客戶端當指定訪問地址時只須要指定服務器IP地址加端口加工程名加類名就能夠了,例如:http://192.168.1.102:8080/appserver/Login,服務器接到請求後會調用login包下Login類進行操做。這些服務器端的類都繼承類HttpServlet,例如當咱們接收Post方法傳來的數據時使用以下代碼能夠獲得客戶端傳遞過來的數據:
public class Login extends HttpServlet{ pubfic void doPost(HttpServletRequest request, HttpServletResponse resp onse) throws ServletException, IOException{ String name_ c=new String( request.getParameter("name_ c").getBytes("i so-8859-1 "), "UTF-8");//獲得用戶名 String password=new String(request.getParameter("password").getBytes ("iso-8859-1"), "UTF-8");//獲得客戶端發送過來的密碼 //接着執行其餘一些操做,例如數據操做等等 }}
|
往客戶端發送數據的時候要先PrintWriter out=response.getWriter();能夠使用out的方法print()和flush()把數據寫入併發送到客戶端。各個服務器模塊的思路和代碼實現和上面的登陸模塊都大同小異,區別就在於接收的數據內容、數量不一樣,執行數據庫的操做不一樣,例若有的是查詢,有的插入等等,所以咱們再也不逐一介紹各個模塊的代碼實現。
本章詳細說明了安卓移動客戶端軟件的設計與實現。設計出了整個系統的整體實現方案和軟件的整體構架方案。介紹了移動客戶端軟件的界面設計、各個模塊的實現細節、數據庫的設計方案、服務器端的設計與實現細節。重點實現了安卓四個大類的中各個Activity的實現、安卓的監聽機制,以及客戶端與服務器端交互過程的實現。
在軟件開發中通常測試分兩種:白盒測試和黑盒測試。
黑盒測試是針對移動客戶端軟件系統的測試方式,要從用戶的角度出發,檢驗應用是否功能正常,檢驗應用是否偏離應用的需求。
白盒測試跟黑盒測試不一樣,它針對的是軟件系統的代碼,檢驗程序的邏輯等是否有誤
在開發的末期,咱們己經進行了白盒測試,本身感受沒有問題後找了幾個未參與開發的同窗們從用戶的角度測試網站,也就是咱們進行了黑盒測試,下面咱們重點介紹一下黑盒測試。
移動客戶端軟件是基於Android系統開發的應用軟件,咱們使用安裝好APK的真機來測試的,系統的服務器端使用實驗室的PC。測試的目的是總結開發及測試階段的過程,檢測移動客戶端可否在服務器端正常的狀況下正常工做,同時檢測移動客戶端軟件系統的性能。服務器端電腦的操做系統是Windows?,中興、華爲、三星等安卓系統手機做爲測試時使用的手機終端。服務器端電腦的配置爲:Intel CPU雙核3.39GHz、3.4GHz;內存:3.00G;硬盤容量:3206 0
功能與性能方面測試是咱們主要測試工做,對移動客戶端在手機上進行了實際使用測試。預期測試功能以下表所示:
首先肯定軟件相關係統配置正確,而後安裝移動客戶端。本次測試包含單機測試和多機同時測試,啓動移動客戶端軟件後隨機使用客戶端的任何功能,測試過程當中隨時記錄測試的結果或者出現的問題與BUG。
最後總結一下測試結果,測試代表,客戶端界面設計大方美觀,符合用戶使用習慣,登陸等各個模塊在硬件網絡正常的狀況下能夠正常工做,性能優秀,除了網絡速度的影響,應用軟件不會產生延遲的狀況,整體上功能體驗是流暢的。登陸註冊能夠成功工做,重複名不可能註冊,朋友圈能夠發佈狀態、回覆狀態、發表圖片等等,總的來講,移動客戶端軟件的整個系統經過了測試,包括客戶端軟件和服務器端功能。本次移動客戶端軟件的開發是成功的。固然測試過程也出現了一些小問題,例如由於各個手機的屏幕大小、分辨率不一樣的緣由致使軟件界面的不統一等問題,還有一些功能上的問題,例如,下拉刷新時出現了重複項等,都一一進行了解決。客戶端各個功能模塊均可以正常工做,
例如登陸後以下圖所示:
登陸成功後才能夠進行朋友圈(微圈)並進行發表評論等操做,以下圖:
各個模塊的成功運行的截圖在此不一一介紹。
本文結合本實驗室與學校合做的實際項目,設計並開發了基於安卓的移動客戶端系統,包括手機應用以及相應的服務器端接口的開發。根據學校的需求,咱們進行了需求分析並進行了模塊劃分與開發流程的設計,通過幾個月的努力,軟件系統順利開發完成,並與學校人員完成了交接,用戶的意見反饋代表,整個系統運行穩定,可以知足學校和用戶需求。
本文主要介紹實際項目的中移動客戶端軟件系統的設計和開發工做,在可行性分析完成後,制定了需求分析並肯定了開發流程圖,對用到的Android等系統相關的技術知識進行了介紹,涉及的技術包括Android應用開發,基於Tomcat,MySQL, JAVA等服務器端接口的設計與開發。本文完成了Android應用全部界面的設計、各個功能模塊實現以及對應的數據庫關係設計和服務器端接口的實現。論文詳細說明了客戶端各個功能模塊的實現細節,同時也講解了服務器端接口的實現方法,並以登陸接口爲例進行了詳細說明。最終完成了移動客戶端應用系統的開發。
測試完成後由學校相關人員進行驗收,驗收過程是愉快的,應用在網上發佈後全部人員就均可以使用了,根據用戶的反映,系統運行情況良好,同時使用用戶達300人時不會有明顯的延遲,用戶體驗效果良好,軟件運行穩定。
本移動客戶端軟件系統的開發工做己經取得階段性成果,之後還會繼續開發第二版軟件,在運行過程當中會累積用戶反饋的意見的新的需求,在之後的工做中還會對軟件系統進行不斷的優化改進和增長新的功能。之後的功能改進可能包括如下幾點:
(1) 如今只能記住一個用戶的用戶名並自動填寫,之後可能會增長支持記住多個帳號並實現切換帳號功能。
(2) 如今朋友圈只一次發表一張圖片,之後可能會增長支持同時發表多張圖片的功能
(3) 如今用戶還不能修改本身的用戶頭像,這部分下一個版本也是要加上的。
(4) )加強客戶端軟件在不一樣設備上運行時候的兼容性,尤爲是手機和平板的兼容性。
[1] 馬越.Android的架構與應用「D].中國地質大學(北京),2008.
[2] 沈愛濤,程濤.基於Android平臺的應用系統開發環境研究[[J].計算機光盤軟件與應用,2013, (7):247-247.
[3] 賈震斌,董洪逾,陳娟等.Android應用開發中多任務機制剖析[[J].福建電腦,2013, 29(9):46-47.
[4] Brestovac G, Grbac T G, Grgurina R. Development environment for Androidapplication development: An experience report.[J]. MIPRO, 2011 Proceedings ofthe 34th International Convention, 2011:1693一1698.
[5] 周輝.基於Android移動學習平臺研究與實現[D].電子科技大學,2012.
[6] Peng B, Yue J, Tianzhou C. The Android Application Development College Challenge[J]. High Performance Computing and Communication&2012 IEEE9th International Conference on Embedded Software and Systems (HPCC-ICESS), 2012 IEEE 14th International Conference on, 2012, 248(4):1677一1681.
至此,這篇論文己經接近尾聲。首先我要感謝個人論文指導老師一一xxx
老師,在許志聞老師的幫助和指導下,遇到的無數困難和疑惑都獲得瞭解決。在
論文寫做過程當中,朋友和同窗熱情幫助我查找資料和提供格式的修改建議,沒有
他們的幫助,論文就不會這麼順利的完成。還要感謝吉林大學提供了這麼好的學
習和實驗環境,讓我能方便的在圖書館和網上查找相關資料。最後還要感謝一直
在默默支持和鼓勵我努力學習的父母,謝謝大家!
代碼之間工做室,專業計算機程序設計。
技術交流QQ羣:439261058
商務合做加QQ:1215714557