

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 畢業(yè)論文(設計)</b></p><p> 面向android系統(tǒng)的測試工具</p><p> 學 生 姓 名: </p><p> 指導教師: 講師 </p><p> 專業(yè)名稱:
2、 電子信息工程 </p><p> 所在學院: 信息工程學院 </p><p><b> 2012年06月</b></p><p><b> 目錄</b></p><p><b> 摘要I</b></p>
3、<p> AbstractII</p><p><b> 第1章 緒論1</b></p><p> 1.1. 課題背景1</p><p> 1.2. 課題說明1</p><p> 第2章 Android開發(fā)系統(tǒng)綜述3</p><p> 2.1. android系
4、統(tǒng)介紹3</p><p> 2.2. 開發(fā)環(huán)境介紹5</p><p> 2.3. 開發(fā)語言介紹7</p><p> 第3章 測試工具介紹9</p><p> 3.1. 測試工具結構介紹9</p><p> 3.2. 測試工具中Service介紹12</p><p> 第4
5、章 總體設計22</p><p> 4.1. 概述22</p><p> 4.2. 構成23</p><p> 第5章 設計思想24 </p><p> 5.1. 設計思想概述24</p><p> 5.2. 設計原則25</p><p> 第6章 結論.35</
6、p><p><b> 致謝36</b></p><p><b> 參考文獻37</b></p><p> 附錄........................................................................................................
7、.............38</p><p><b> 摘要</b></p><p> 基于 Android 的自動化測試的設計與實現(xiàn)以Android 客戶端的測試為研究內容,分析了 Android 自動化測試框架及其層次關系,嘗試在現(xiàn)有測試方法的 基 礎 上 進 行 測 試 手 段 的 優(yōu) 化 和 創(chuàng) 新 。 研 究 了 基 于 JUnit 和 instrum
8、entaion 的 Android 自 動 化 框 架 的 實 現(xiàn) 技 術 ,并 利 用 Hudson 進行集成,實現(xiàn) Android 的自動化測試。產(chǎn)品的開發(fā)實踐表明, 這種自動化測試方法效率高、用戶體驗好, 對于 Android 的自動化測試研究具有一定參考價值。Android應用程序使用Java做為開發(fā)語言,把編譯后的Java代碼連同其它應用程序需要的數(shù)據(jù)和資源文件一起打包到一個Android包文件中,這個文件使用.apk做為
9、擴展名,它是分發(fā)應用程序并安裝到移動設備的媒介,用戶只需下載并安裝此文件到他們的設備。單一.apk文件中的所有代碼被認為是一個應用程序。</p><p> 關鍵詞: 關鍵詞:測試自動化;Android;設計 </p><p><b> Abstract</b></p><p> This paper focuses on test
10、ing of Android clients. The authors analyze the Android automated testing framework and its hierarchy. The implementation is based on two automated testing framework of Android platform: JUnit a
11、nd instrumentation. The purpose of this article is to propose an optimized test method. Making use of the continuous integration features of Hudson, the real sense of automated testing can be
12、 achieved. It shows that t</p><p> Key words:automated testing;Android;mobile phone;design</p><p><b> 緒論</b></p><p><b> 課題背景</b></p><p>
13、 作為20世紀最偉大的發(fā)明之一,計算機也進入了后PC時代。不知不覺中,形形色色的數(shù)字產(chǎn)品成為主要的信息處理工具、并且逐步形成一個充滿商機的巨大產(chǎn)業(yè)。</p><p> 隨著后PC時代的到來,人們開始接觸全新的計算機軟件,計算及操作系統(tǒng)。Android系統(tǒng)的開源,為計算機產(chǎn)品的生產(chǎn)商們又一次創(chuàng)造了商機,越來越多的人開始知道Android,認識Android,開始使用Android,這樣也就使得Android產(chǎn)品
14、走進了一個美好的時代,而Android產(chǎn)品程序的測試也被生產(chǎn)商們開始慢慢的拿到了日程上,這關系到他們生產(chǎn)過程中能否更多的節(jié)約時間金錢。</p><p> 此次設計通過對Android系統(tǒng)測試工具的開發(fā),可以掌握Android系統(tǒng)軟件開發(fā)的基本技術、例如Android的用戶界面設計,Android進程間的通信,以及我們采用的Java語言等。既可以用于國內的軟件開發(fā)、又可在將來的實際工作中的對日產(chǎn)品開發(fā)中有所助益。
15、</p><p><b> 課題說明</b></p><p><b> 設計要求</b></p><p> Android模擬器,Java語言,Eclipse開發(fā)環(huán)境。能理解、掌握Android軟件開發(fā)的基本知識。</p><p><b> 設計內容</b></p
16、><p> 評價邏輯的手動設定,而后會自動執(zhí)行,Sevice部分解決,實現(xiàn)AP與測試工具的種種通信與聯(lián)系,自動評價用Adapter層。</p><p><b> 實現(xiàn)方法</b></p><p> ?、旁赑C機上,利用Eclipse的開發(fā)軟件,編寫程序代碼,并進行編譯代碼以及對代碼進行調試,編譯調試成功后,再利用Android模擬器來初步的模擬
17、運行。測試工具要實現(xiàn)的部分除了測試相關代碼外,還有與AP進行調用的部分,主要是需要給AP提供相關的接口。</p><p> (2)以下是測試工具的結構圖,其中藍色字體為需要改動或是添加的部分。</p><p> Android系統(tǒng)開發(fā)綜述</p><p> Android系統(tǒng)介紹</p><p> Android是一個智能手機及便攜設
18、備操作系統(tǒng),中文名安卓、安致。由Google在2007年推出,并迅速成為智能手機的主流操作系統(tǒng)。</p><p> 下圖為Android創(chuàng)始開發(fā)者合影:</p><p> Android是一個冉冉升起的新系統(tǒng),僅用2年時間就從零到市場巨擘。而nokia用了12年,apple用了5年.截止到2010年第四季度,在全球智能手機市場安卓已經(jīng)完成對于nokia及apple的超越,同時增長速度也
19、是遠遠超過其他對手。</p><p> 以下兩個表是Android發(fā)展的相關數(shù)據(jù)調查:</p><p><b> 系統(tǒng)開放性</b></p><p> 在優(yōu)勢方面,Android平臺首先就是其開放性,開放的平臺允 android系統(tǒng)標志。</p><p> 許任何移動終端廠商加入到Android聯(lián)盟中來。顯著的開
20、放性可以使其擁有更多的開發(fā)者,隨著用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開發(fā)性對于Android的發(fā)展而言,有利于積累人氣,這里的人氣包括消費者和廠商,而對于消費者來講,最大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機</p><p><b> 掙脫運行商的束縛</b></p><p> 在
21、過去很長的一段時間,特別是在歐美地區(qū),手機應用往往受到運營商制約,使用什么功能接入什么網(wǎng)絡,幾乎都受到運營商的控制。自從iPhone上市,用戶可以更加方便地連接網(wǎng)絡,運營商的制約減少。隨著EDGE、HSDPA這些2G至3G移動網(wǎng)絡的逐步過渡和提升,手機隨意接入網(wǎng)絡已不是運營商口中的笑談。</p><p> 2.1.3豐富的硬件選擇</p><p> 這一點還是與Android平臺的開放
22、性相關,由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產(chǎn)品。功能上的差異和特色,卻不會影響到數(shù)據(jù)同步、甚至軟件的兼容。好比你從諾基亞Symbian風格手機一下改用蘋果iPhone,同時還可將Symbian中優(yōu)秀的軟件帶到iPhone上使用、聯(lián)系人等資料更是可以方便地轉移。</p><p> 2.1.4不受任何限制的開發(fā)商</p><p> Android平臺提
23、供給第三方開發(fā)商一個十分寬泛、自由的環(huán)境。因此不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟件會誕生。為未來的軟件行業(yè)做出非凡的成就。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如何控制正是留給Android難題之一。也是留給軟件行業(yè)的,社會的難題。</p><p><b> 開發(fā)環(huán)境介紹</b></p><p> Eclipse是著名的跨平臺的自
24、由集成開發(fā)環(huán)境(IDE)。最初主要用來Java語言開發(fā)。</p><p> Eclipse的本身只是一個框架平臺,但是眾多插件的支持使得Eclipse擁有其他功能相對固定的IDE軟件很難具有的靈活性。許多軟件開發(fā)商以Eclipse為框架開發(fā)自己的IDE。</p><p> Eclipse最初是由IBM公司開發(fā)的替代商業(yè)軟件Visual Age for Java的下一代IDE開發(fā)環(huán)境,2
25、001年11月貢獻給開源社區(qū),現(xiàn)在它由非營利軟件供應商聯(lián)盟Eclipse基金會(Eclipse Foundation)管理。 2003年,Eclipse 3.0選擇OSGi服務平臺規(guī)范為運行時架構。 2007年6月,穩(wěn)定版3.3發(fā)布。2008年6月發(fā)布代號為Ganymede的3.4版。</p><p> Eclipse的基礎是富客戶機平臺(Rich Client Platform, 即RCP)。RCP包括下列組
26、件:</p><p> 核心平臺(啟動Eclipse,運行插件)</p><p> OSGi(標準集束框架)</p><p> SWT(可移植構件工具包)</p><p> JFace(文件緩沖,文本處理,文本編輯器)</p><p> Eclipse工作臺(即Workbench ,包含視圖(views)、編
27、輯器(editors)、視角(perspectives)、和向導(wizards))</p><p> Eclipse采用的技術是IBM公司開發(fā)的(SWT),這是一種基于Java的窗口組件,類似Java本身提供的AWT和Swing窗口組件;不過IBM聲稱SWT比其他Java窗口組件更有效率。Eclipse的用戶界面還使用了GUI中間層JFace,從而簡化了基于SWT的應用程序的構建。</p>&l
28、t;p> Eclipse的插件機制是輕型軟件組件化架構。在富客戶機平臺上,Eclipse使用插件來提供所有的附加功能,例如支持Java以外的其他語 言。 已有的分離的插件已經(jīng)能夠支持C/C++(CDT)、Perl、Ruby,Python、telnet和數(shù)據(jù)庫開發(fā)。插件架構能夠支持將任意的擴展加入到 現(xiàn)有環(huán)境中,例如配置管理,而決不僅僅限于支持各種編程語言。</p><p> Eclipse的設計思想是:
29、一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。Eclipse基本內核包括:圖形API (SWT/Jface), Java開發(fā)環(huán)境插件(JDT ),插件開發(fā)環(huán)境(PDE)等。</p><p> Eclipse由各種不同的計劃組成。以下列出了部分計劃。</p><p> Eclipse計劃:本身包括Eclipse平臺,Eclipse富客戶端平臺
30、(RCP)和Java開發(fā)工具(JDT)。</p><p> Eclipse測試和性能工具平臺(TPTP):提供一個允許軟件開發(fā)者構建諸如測試調試、概況分析、基準評測等測試和性能工具的平臺。</p><p> Eclipse Web工具平臺計劃 (WTP):用Java企業(yè)版Web應用程序開發(fā)工具來擴展Eclipse平臺。它由以下部分組成:HTML、JavaScript、CSS、JSP、S
31、QL、XML、DTD、XSD和WSDL的 源代碼編輯器;XSD和WSDL的圖形界面編輯器;Java企業(yè)版的“項目性質”(project nature)、建構器(builder)和模型(model),與一個Java企業(yè)版的導航(navigator);一個Web服務(Web service)向導和瀏覽器,還有一個WS-I測試工具;最后是數(shù)據(jù)庫訪問查詢的工具與模型。</p><p> Eclipse商業(yè)智能和報表工具
32、計劃(BIRT):提供Web應用程序(特別是基于Java企業(yè)版的)的報表開發(fā)工具。</p><p> Eclipse可視化界面編輯器計劃(VEP):一個Eclipse下創(chuàng)建圖形用戶界面代碼生成器的框架。</p><p> Eclipse建??蚣埽‥MF):依據(jù)使用XMI描述的建模規(guī)格,生成結構化數(shù)據(jù)模型的工</p><p> 具和其他應用程序的代碼。</
33、p><p> 圖形化編輯器框架(GEF):能讓開發(fā)者采用一個現(xiàn)成的應用程序模型來輕松地創(chuàng)建。</p><p> UML2:Eclipse平臺下的一個UML 2.0元模型的實現(xiàn),用以支持建模工具的開發(fā)。</p><p> AspectJ:一種針對Java的面向側面語言擴展。</p><p> Eclipse通訊框架(ECF):專注于在Ecl
34、ipse平臺上創(chuàng)建通訊應用程序的工作。</p><p> Eclipse數(shù)據(jù)工具平臺計劃(DTP)</p><p> Eclipse設備驅動軟件開發(fā)計劃(DSDP)</p><p> C/C++開發(fā)工具計劃(CDT):努力為Eclipse平臺提供一個全功能集成開發(fā)器。</p><p> Eclipse平臺COBOL集成開發(fā)環(huán)境子計劃(
35、COBOL):將構建一個Eclipse平臺上的全功能COBOL集成開發(fā)環(huán)境。</p><p> 并行工具平臺(PTP):將開發(fā)一個對并行計算機架構下的一組工具進行集成工具。 </p><p> 嵌入式富客戶端平臺(eRCP):計劃將Eclipse富客戶端平臺擴展到嵌入式設備上。這個平臺主要是一個富客戶端平臺(RCP)組件子集的集合。它能讓桌面環(huán)境下的應用程序模型能夠
36、大致同樣地能運用在嵌入式設備上</p><p><b> 開發(fā)語言介紹</b></p><p> Java最初被命名為Oak,目標設定在家用電器等小型系統(tǒng)的編程語言,來解決諸如電視機、電話、鬧鐘、烤面包機等家用電器的控制和通訊問題。由于這些智能化家電的市場需求沒有預期的高,Sun放棄了該項計劃。就在Oak幾近失敗之時,隨著互聯(lián)網(wǎng)的發(fā)展,Sun看到了Oak在計算機網(wǎng)
37、絡上的廣闊應用前景,于是改造了Oak,以“Java”的名稱正式發(fā)布。 </p><p> Java 編程語言的風格十分接近C、C++語言。Java是一個純的面向對象的程序設計語言,它繼承了 C++ 語言面向對象技術的核心,Java舍棄了C ++語言中容易引起錯誤的指針(以引用取代)、運算符重載(operator overloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對象
38、所占據(jù)的內存空間,使得程序員不用再為內存管理而擔憂。在 Java SE 1.5 版本中,Java 又引入了泛型編程(Generic Programming)、類型安全的枚舉、不定長參數(shù)和自動裝/拆箱等語言特性。 Java 不同于一般的編譯執(zhí)行計算機語言和解釋執(zhí)行計算機語言。它首先將源代碼編譯成二進制字節(jié)碼(bytecode),然后依賴各種不同平臺上的虛擬機來解釋執(zhí)行字節(jié)碼,從而實現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺特性。不過,每次的編譯執(zhí)
39、行需要消耗一定的時間,這同時也在一定程度上降低了 Java 程序的運行效率。但在 J2SE 1.4.2 發(fā)布后,Java 的執(zhí)行速度有了大幅提升。 與傳統(tǒng)程序不同,Sun 公司在推出 Java 之際就將其作為一種開放的技術。全球數(shù)以萬計</p><p><b> 測試工具介紹</b></p><p><b> 測試工具結構介紹</b><
40、/p><p> Android自動化測試目前可借鑒的經(jīng)驗不多,現(xiàn)在采取的方式就是通過java代碼對Activity和View進行操作,目前已知的入口是Instrumentation類。 </p><p> Instrumentation與Activity均位于android.app包下,這個包內還有諸如ActivityManagerNative這種不對App層開放的類,通過查看Androi
41、d源碼發(fā)現(xiàn)Activity類中諸如startActivity(Intent intent)這樣重要的方法都是通過Instrumentation實現(xiàn),Instrumentation中也提供了一系列對Activity生命周期控制的方法。以Instrumentation為基礎,Android SDK在Junit基礎上進行了擴展,提供了AndroidTestCase類及系列子類,其中最重要的一個類是ActivityInstrumentation
42、TestCase2</p><p> 基于Instrumentation的測試框架的工作原理SDK中的這張圖說明的很清楚了:</p><p> 研究Android源碼發(fā)現(xiàn)框架層中有很多對測試有幫助的類、方法都被加上了注解或是聲明為private的,無法從app層訪問。自然而然我們想到了java的反射機制,java反射允許我們訪問這樣的類和方法。 </p><p>
43、; 在上面的基礎上,國外有人開發(fā)出了robot/" target="_blank" >Robotium工具,可以在有app源碼或apk的情況下進行自動化黑盒測試。 </p><p> 但是Robotium目前的缺點也很明顯,無法對WebView進行操作,這對大量使用WebView的淘寶Android客戶端來說無疑是很大的限制。 </p><p>
44、而且Robotium提供的API是面向過程的,測試代碼的可擴展性差。 </p><p> 我們需要一個面向對象的,可對WebView進行操作的自動化測試框架,這就催生了TMTS(Taobao Mobile Test Studio)框架。 </p><p> TMTS立項時還試圖著重解決另一個問題,就是Instrumentation框架下testapp和app運行在一個進程中 ,app
45、crash會導致testapp一并crash。當時和士敦一起研究了Instrumentation、Activity的啟動流程,甚至想去研究一下dalvik是如何解析Manifest文件的,最后也沒有想到好的方法,收獲就是了解了android更底層一些的細節(jié),這個問題現(xiàn)在先擱置了起來。 </p><p> 從測試代碼方面來看, Robotium中采用的是actionMethod(View, arg)的方式,TMT
46、S中采用getView(id).actionMethod(arg)的方式,更加符合java的編程習慣。TMTS測試代碼的編寫也就是分三步,找到View,調用View的相應的action方法,斷言。 </p><p> TMTS框架主要思想就是通過反射機制調用Android框架層API拿到當前Activity的所有View,在此基礎上返回需要獲得的View對象,對獲得的View通過Instrumentation封
47、裝一些此View常用的操作,最后返回,這就是TmtsView及其子類。 </p><p> 這種方式缺點也很明顯,對每個從android.View繼承來的子類,如果其中有特殊的操作,就需要封裝出一個對應的TmtsView子類。 </p><p> 還有一個缺點就是目前是通過View在布局文件中聲明的id去尋找,這樣測試人員在編寫代碼時需要對app的源碼非常熟悉,了解當前操作的view的
48、id是多少,在傳遞id參數(shù)時還有可能寫錯。之后我們對這個方式進行了一些改進,使用SDK自帶的hierarchyviewer工具獲得view的id;對每個布局文件進行解析生成java類,這個類中會提供方法返回布局文件中的所有帶id的view,經(jīng)過討論,最后按view子類型來對一個布局中的view進行歸類。 </p><p> Bug的定位離不開日志,因而日志系統(tǒng)也是一個測試框架重要的組成部分,Android的Lo
49、g類中提供了一系列的靜態(tài)方法可以在IDE中打印日志。在TMTS中,提供TmtsLog類,除日志打印外可將日志內容實時保存至SD卡指定目錄,在框架代碼中的關鍵部位都加上了這樣的日志用來保存異常時的調用棧信息,用戶的測試代碼中也可以加上對TmtsLog的調用跟蹤測試代碼執(zhí)行進度,TmtsLog將為每個測試類保存一份這樣的日志文件,同時包含用戶的過程日志和框架異常日志,文件名以精確到毫秒的日期加以區(qū)分。 </p><p&g
50、t; 項目做到這里遠遠沒有結束,套用屈原的一句話就是路漫漫其修遠兮。 </p><p> 后面計劃解決的問題有: </p><p> 1.跨進程測試,讓testapp和app運行在兩個不同的進程中,這是一個大坑。 </p><p> 2.穩(wěn)定性問題,目前框架中有很多地方硬編碼Thread.sleep()去等待一個View加載完成,避免對空的View進行操作,
51、或者是對一個view進行set操作后,也需要等待一段時</p><p> 間讓操作生效。希望能找到一種回調機制優(yōu)雅的解決。 </p><p> 而且Robotium提供的API是面向過程的,測試代碼的可擴展性差。 </p><p> 我們需要一個面向對象的,可對WebView進行操作的自動化測試框架,這就催生了TMTS(Taobao Mobile Test S
52、tudio)框架。 </p><p> TMTS立項時還試圖著重解決另一個問題,就是Instrumentation框架下testapp和app運行在一個進程中 ,app crash會導致testapp一并crash。當時和士敦一起研究了Instrumentation、Activity的啟動流程,甚至想去研究一下dalvik是如何解析Manifest文件的,最后也沒有想到好的方法,收獲就是了解了android更底
53、層一些的細節(jié),這個問題現(xiàn)在先擱置了起來。 </p><p> 從測試代碼方面來看, Robotium中采用的是actionMethod(View, arg)的方式,TMTS中采用getView(id).actionMethod(arg)的方式,更加符合java的編程習慣。TMTS測試代碼的編寫也就是分三步,找到View,調用View的相應的action方法,斷言。 </p><p>
54、TMTS框架主要思想就是通過反射機制調用Android框架層API拿到當前Activity的所有View,在此基礎上返回需要獲得的View對象,對獲得的View通過Instrumentation封裝一些此View常用的操作,最后返回,這就是TmtsView及其子類。 </p><p> 這種方式缺點也很明顯,對每個從android.View繼承來的子類,如果其中有特殊的操作,就需要封裝出一個對應的TmtsVie
55、w子類。 </p><p> 項目做到這里遠遠沒有結束,套用屈原的一句話就是路漫漫其修遠兮。后面計劃解決的問題有: </p><p><b> 跨進程測試</b></p><p> 讓testapp和app運行在兩個不同的進程中,這是一個大坑。 </p><p><b> 穩(wěn)定性問題</b>
56、;</p><p> 目前框架中有很多地方硬編碼Thread.sleep()去等待一個View加載完成,避免對空的View進行操作,或者是對一個view進行set操作后,也需要等待一段時間讓操作生效。希望能找到一種回調機制優(yōu)雅的解決。 </p><p> 3.設法捕獲Toast消息 </p><p> 后面可能會研究的方向,是通過非java的方式來實現(xiàn)andr
57、oid自動化測試。Android目前已經(jīng)通過ASE(Android Scripting Environment)支持了多種腳本語言,如phyton,lua,perl等,限于目前的人力還沒有時間來研究這一塊,相信ASE會給Android自動化開辟一片新天地。 </p><p> 最后談一點點感悟,老子曾經(jīng)曰過:“持而盈之,不如其已;揣而銳之,不可長保。金玉滿堂,莫之能守;富貴而驕,自遺其咎?!焙汀爸貫檩p根,靜為
58、躁君?!钡谝痪湓捳f有缺陷才是真正的完美,沒有一個方案是真正完美的。第二句話說有時候看起來完美的方案,過段時間之后又不適用了,而且不適用的地方很可能就是當初覺得完美的地方,對于軟件項</p><p> 目解決方案也是如此。 </p><p> 測試工具中Service介紹</p><p><b> Service概述</b></p&
59、gt;<p> 由于手機屏幕的限制,通常情況下在同一時刻僅有一個應用程序牌激活狀態(tài),并能夠顯示在手機屏幕上,因此,應用程序需要一種機制,在沒有用戶界面的情況下,合其能夠長時間在后臺運行,實現(xiàn)應用程序的特定功能,并能夠處理事件或更新數(shù)據(jù),Android系統(tǒng)提供了(Service)服務組件,它不直接與用戶進行交互,卻能夠長期在后臺運行。有很多情況需要使用Service,典型的例子就是:MP3播放器。</p>&
60、lt;p> Service非常適用于無需用戶干預,且需要長期運行的后臺功能。Service沒有用戶界面,有利于降低系統(tǒng)資源。而且Service比Activity具有更高的優(yōu)先級,因此在系統(tǒng)資源緊張的時候,Service不會輕易被Android系統(tǒng)終止。即使Service被系統(tǒng)終止了,在系統(tǒng)資源恢復后Service也將自動恢復運行狀態(tài),因此可以認為Service是在系統(tǒng)中永久運行的組件。Service除了實現(xiàn)后臺服務功能,還可以用
61、于進程間通信,解決兩個不同Activity應用程序進程之間的調用和通信問題。</p><p> Service概覽:</p><p><b> 類結構圖:</b></p><p> Service生命周期:</p><p><b> 三個生命周期函數(shù):</b></p><
62、p> onCreate()</p><p><b> onStart()</b></p><p><b> onDestory</b></p><p><b> 生命周期圖:</b></p><p><b> Service啟動</b>&l
63、t;/p><p> 啟動Service的兩種方式:startService 和bindService</p><p> 一、startService啟動Service</p><p><b> 示例:</b></p><p> 1、 先創(chuàng)建一個類繼承于Service然后重寫onBind()[且這個方法必須實現(xiàn)],on
64、Create()、onStart()、onDestory()方法</p><p> 2、 在AndroidMainfest.xml中注冊剛才寫的這個Service</p><p> view plainprint?</p><p> <service android:name=".MyService" ></p>
65、<p> <intent-filter ></p><p> <action android:name="com.jiahui.myservice" /></p><p> </intent-filter></p><p> </service></p><p&
66、gt; 3、 通過在Activty中啟動Service</p><p> startServiceDemo:</p><p> MyService繼承于Service類</p><p> view plainprint?</p><p> package com.jiahui.serviceDemo;</p><
67、p> import android.app.Service;</p><p> import android.content.Intent;</p><p> import android.os.IBinder;</p><p> public class MyService extends Service {</p><p>
68、<b> @Override</b></p><p> public IBinder onBind(Intent arg0) {</p><p> // TODO Auto-generated method stub</p><p> return null;</p><p><b> }</b
69、></p><p><b> @Override</b></p><p> public void onCreate() {</p><p> System.out.println("----onCreate-----");</p><p> super.onCreate();</
70、p><p><b> }</b></p><p><b> @Override</b></p><p> public void onDestroy() {</p><p> System.out.println("----onDestory-----");</p>
71、;<p> super.onDestroy();</p><p><b> }</b></p><p><b> @Override</b></p><p> public void onStart(Intent intent, int startId) {</p><p>
72、 System.out.println("----onStart-----");</p><p> super.onStart(intent, startId);</p><p><b> }</b></p><p><b> }</b></p><p> MainAct
73、ivty:</p><p> view plainprint?</p><p> package com.jiahui.serviceDemo;</p><p> import android.app.Activity;</p><p> import android.content.Intent;</p><p&
74、gt; import android.os.Bundle;</p><p> import android.view.View;</p><p> import android.widget.Button;</p><p> public class MainActivity extends Activity {</p><p>
75、public void onCreate(Bundle savedInstanceState) {</p><p> super.onCreate(savedInstanceState);</p><p> setContentView(R.layout.main);</p><p> Button btnStart = (Button) findViewBy
76、Id(R.id.btnStart);</p><p> Button btnStop = (Button) findViewById(R.id.btnStop);</p><p> final Intent service = new Intent();</p><p> service.setAction("com.jiahui.myservice
77、");</p><p> btnStart.setOnClickListener(new View.OnClickListener() {</p><p><b> @Override</b></p><p> public void onClick(View v) {</p><p> // 啟動Se
78、rvice</p><p> MainActivity.this.startService(service);</p><p><b> }</b></p><p><b> });</b></p><p> btnStop.setOnClickListener(new View.OnCli
79、ckListener() {</p><p><b> @Override</b></p><p> public void onClick(View v) {</p><p> // 停止Service</p><p> MainActivity.this.stopService(service);</p
80、><p><b> }</b></p><p><b> });</b></p><p><b> }</b></p><p><b> }</b></p><p> Service已創(chuàng)建則只會調用onStart()方法,st
81、opService將調用onDestory()方法</p><p> 除了通過startService來啟動Service外我們還可以通過bindService()方法啟動Service,也正好我們可以來好好比較這兩種方式的區(qū)別。</p><p> bindService方法啟動Service</p><p> 先看bindSerivce(Intent ser
82、vice,ServiceConnection conn,int flags)函數(shù)</p><p><b> 參數(shù)說明:</b></p><p> service:通過該參數(shù)也就是Intent我們可以啟動指定的Service</p><p> conn:該參數(shù)是一個ServiceConnection對象,這個對角用于監(jiān)聽訪問者(也可以說成是
83、客戶端)與Service之間的連接情況,當訪問者與Service連接成功時將回調ServiceConnection對象的onServiceConnected(ComponentName name,Ibinder service)方法;如果斷開將回調onServiceDisConnected(CompontName name)方法</p><p> flags:指定綁定時是否自動創(chuàng)建Service。</p&
84、gt;<p><b> 步驟:</b></p><p> 1、 新建一個類繼承于Service類,重寫onBind()、onCreate()、onUnBind()、onDestory()方法。再在這個類里聲明一個Ibinder的子類對象用于提供于客戶端,同時可以定義一些成員變量,客戶端可以獲取到這個成員變量屬性</p><p> 2、 在Andro
85、idMainfest.xml文件中注冊這個Service</p><p> 3、 在Activity里通過bindService綁定Service</p><p><b> 示例代碼:</b></p><p> package com.jiahui.serviceDemo;</p><p> import and
86、roid.app.Service;</p><p> import android.content.Intent;</p><p> import android.os.Binder;</p><p> import android.os.IBinder;</p><p> public class MyService extends
87、 Service {</p><p> private int count;</p><p> private boolean quit;</p><p> private MyBinder binder = new MyBinder();</p><p> // 新建一個Binder對象用于提供給客戶端</p><
88、;p> public class MyBinder extends Binder {</p><p> public int getCount() {</p><p> return count;</p><p><b> }</b></p><p><b> }</b></p
89、><p><b> @Override</b></p><p> public IBinder onBind(Intent intent) {</p><p> System.out.println("----onBind-----");</p><p> // 返回給客戶端一個Binder對象&
90、lt;/p><p> return binder;</p><p><b> }</b></p><p><b> @Override</b></p><p> public void onCreate() {</p><p> System.out.println(&
91、quot;----onCreate-----");</p><p> // 啟動一條線程修改成員變量屬性</p><p> new Thread() {</p><p><b> @Override</b></p><p> public void run() {</p><p>
92、; while (!quit) {</p><p><b> try {</b></p><p> Thread.sleep(1000);</p><p> } catch (Exception e) {</p><p><b> }</b></p><p><
93、;b> count++;</b></p><p><b> }</b></p><p><b> }</b></p><p> }.start();</p><p><b> }</b></p><p><b>
94、@Override</b></p><p> public void onDestroy() {</p><p> this.quit = true;</p><p> System.out.println("----onDestory-----");</p><p> super.onDestroy(
95、);</p><p><b> }</b></p><p><b> @Override</b></p><p> public boolean onUnbind(Intent intent) {</p><p> System.out.println("----onUnbind-
96、----");</p><p> return super.onUnbind(intent);</p><p><b> }</b></p><p><b> }</b></p><p> MainActivty</p><p> package com.
97、jiahui.serviceDemo;</p><p> import android.app.Activity;</p><p> import android.content.ComponentName;</p><p> import android.content.Intent;</p><p> import android
98、.content.ServiceConnection;</p><p> import android.os.Bundle;</p><p> import android.os.IBinder;</p><p> import android.view.View;</p><p> import android.widget.But
99、ton;</p><p> import android.widget.Toast;</p><p> public class MainActivity extends Activity {</p><p> private Button btnBind;</p><p> private Button btnUnBind;<
100、/p><p> private Button btnGetData;</p><p> MyService.MyBinder binder;</p><p> // 定義一個ServiceConnection對象</p><p> private ServiceConnection conn = new ServiceConnection
101、() {</p><p> // 當客戶端與Service斷開連接時</p><p><b> @Override</b></p><p> public void onServiceDisconnected(ComponentName name) {</p><p> System.out.println(&q
102、uot;---onServiceDisconnected----");</p><p><b> }</b></p><p> // 當客戶端與Service建立連接時</p><p><b> @Override</b></p><p> public void onServic
103、eConnected(ComponentName name, IBinder service) {</p><p> System.out.println("---onServiceConnected----");</p><p> binder = (MyService.MyBinder) service;</p><p><b>
104、; }</b></p><p><b> };</b></p><p> public void onCreate(Bundle savedInstanceState) {</p><p> super.onCreate(savedInstanceState);</p><p> setConten
105、tView(R.layout.main);</p><p> btnBind = (Button) findViewById(R.id.btnBind);</p><p> btnUnBind = (Button) findViewById(R.id.btnUnBind);</p><p> btnGetData = (Button) findViewById
106、(R.id.btnGetData);</p><p> final Intent intent = new Intent();</p><p> intent.setAction("com.jiahui.myservice");</p><p> btnBind.setOnClickListener(new View.OnClickList
107、ener() {</p><p><b> @Override</b></p><p> public void onClick(View v) {</p><p> // 綁定Service</p><p> bindService(intent, conn, BIND_AUTO_CREATE);</p&
108、gt;<p><b> }</b></p><p><b> });</b></p><p> btnUnBind.setOnClickListener(new View.OnClickListener() {</p><p><b> @Override</b></p&g
109、t;<p> public void onClick(View v) {</p><p><b> // 解除綁定</b></p><p> unbindService(conn);</p><p><b> }</b></p><p><b> });</b
110、></p><p><b> //獲取數(shù)據(jù)</b></p><p> btnGetData.setOnClickListener(new View.OnClickListener() {</p><p><b> @Override</b></p><p> public void o
111、nClick(View v) {</p><p><b> // 獲取數(shù)據(jù)</b></p><p> Toast.makeText(MainActivity.this,</p><p> "Service的count值為" + binder.getCount(),</p><p> Toast
112、.LENGTH_LONG).show();</p><p><b> }</b></p><p><b> });</b></p><p><b> }</b></p><p><b> }</b></p><p> 點擊
113、” 獲取Service里的數(shù)據(jù)”按鈕</p><p> 點擊“unBindService”按鈕</p><p> 所以也可以通過上圖知道bindService的生命周期</p><p> bindService會經(jīng)歷onCreate()-->onBind()-->onUnbind()-->onDestory</p><p&
114、gt; 如何去理解這種通信方式?</p><p> 我的理解是bindService這一方我們可以看作是客戶端,然后客戶端調用bindService()方法去綁定一個Service,Service給我們返回一個Binder對象用于客戶端與Serivce通信,而這個Binder對象我們可以在客戶端的ServiceConnection對象里的一個onServiceConnected()方法取到這個Binder對象
115、,這樣我們就也能取到Service里的數(shù)據(jù)了</p><p><b> 所以總結:</b></p><p> bindService與startService 的區(qū)別:</p><p> 1. 生命周期 :startService() 方式啟動 ,Service 是通過接受Intent 并且會經(jīng)歷</p><p>
116、 onCreate()和onStart() .當用戶在發(fā)出意圖使之銷毀時會經(jīng)歷onDestroy () ,而bindService () 方</p><p> 式啟動 ,與Activity 綁定的時候 ,會經(jīng)歷onCreate() 和onBind () ,而當Activity 被銷毀的時候,Service 會先調用onUnbind () 然后是onDestroy () 。</p><p&g
117、t; 2. 控制方式 :前者的控制方式需要使用固定的方法,對Service 進行單一的操作。而后者由于與Activity 綁定 ,不用考慮其生命周期問題 ,并且從發(fā)送Intent 的被動操作 ,變?yōu)榭梢灾鲃訉ervice 對象進行操作,我們甚至可以建立一個Handler 類,對Service 進行相關的操作。大大加強了Service 的靈活性、可操作性。</p><p> 總結 : 對于簡單的應用start
118、Service() 啟動方式能帶來更少的代碼 , 簡單的操作 。 對于復雜的應用bindService () 方式,雖然帶來的更多的編碼,但同時也帶來了更好的可操作性,使其使用起來更方便。</p><p><b> 總體設計</b></p><p><b> 概述</b></p><p><b> 程序說明
119、</b></p><p> 本項目主要通過Android自動化測試工具對AP進行手動設定,自動執(zhí)行的測試工作。</p><p> PC機上運用Eclipse編輯程序代碼以及對程序代碼進行調試,利用Android模擬器進行程序的測試。</p><p> 編譯成功后即可在Android模擬器上運行程序,進行TestCase的壓入,手動設定,進而執(zhí)行程序
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 面向嵌入式系統(tǒng)的測試工具研究.pdf
- 畢業(yè)論文---qtp測試工具在軟件開發(fā)中的應用
- Android系統(tǒng)的自動化測試工具的設計與實現(xiàn).pdf
- 面向WebSphere應用的系統(tǒng)測試工具的設計與實現(xiàn).pdf
- Android自動化測試工具的設計與實現(xiàn).pdf
- android系統(tǒng)的前景畢業(yè)論文
- Android功能自動化測試工具的設計與實現(xiàn).pdf
- android手機輔助系統(tǒng)畢業(yè)論文
- 基于UML的面向對象軟件測試方法和測試工具研究.pdf
- android畢業(yè)論文
- android操作系統(tǒng)畢業(yè)論文
- 畢業(yè)論文——基于android系統(tǒng)的課程管理系統(tǒng)
- Android手機性能自動化測試工具的研究與實現(xiàn).pdf
- 畢業(yè)論文--基于android的網(wǎng)上訂餐系統(tǒng)
- Android應用業(yè)務自動化測試工具設計與開發(fā).pdf
- 基于android的短信播報系統(tǒng)【畢業(yè)論文】
- 基于android的移動辦公系統(tǒng)畢業(yè)論文
- 基于android的高考寶典系統(tǒng)畢業(yè)論文
- 基于android系統(tǒng)的課程管理系統(tǒng)畢業(yè)論文
- 基于模型的自動化測試工具的實現(xiàn)_畢業(yè)設計論文
評論
0/150
提交評論