版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p><b> 1 緒論2</b></p><p><b> 1.1 背景2</b></p><p> 1.2 Android的崛起2</p><p> 1.3 國(guó)內(nèi)外研究現(xiàn)狀3</p><
2、;p> 1.4 項(xiàng)目研究的主要內(nèi)容4</p><p> 1.5 本章小結(jié)4</p><p> 2 Android的開(kāi)發(fā)環(huán)境4</p><p> 2.1 Android操作系統(tǒng)4</p><p> 2.2 Android開(kāi)發(fā)環(huán)境4</p><p> 2.3 Android開(kāi)發(fā)環(huán)境變量的配置5
3、</p><p> 2.3.1 JDK的配置5</p><p> 2.3.2 SDK的配置6</p><p> 2.4 Eclipse的配置6</p><p> 2.5 本章小結(jié)7</p><p> 3 Android應(yīng)用程序核心7</p><p> 3.1 應(yīng)用程序基礎(chǔ)
4、7</p><p> 3.2 應(yīng)用程序組件8</p><p> 3.2.1 Acitivity8</p><p> 3.2.2 Service9</p><p> 3.2.3 BroadcastReciver10</p><p> 3.2.4 ContentProvider12</p>
5、<p> 3.3 本章小結(jié)12</p><p> 4 項(xiàng)目相設(shè)計(jì)13</p><p> 4.1 研究目的13</p><p> 4.2 需求分析13</p><p> 4.3 游戲界面設(shè)置13</p><p> 4.3.1 等登陸界面13</p><p>
6、4.3.2 游戲主界面14</p><p> 4.3.3 玩家升級(jí)Pk與做任務(wù)的界面14</p><p> 4.3.4 購(gòu)買(mǎi)物品與地產(chǎn)的界面14</p><p> 4.3.5 玩家之間的聊天界面與發(fā)送系統(tǒng)消息與世界消息的界面15</p><p> 4.4 游戲體系設(shè)計(jì)15</p><p> 5 計(jì)代
7、碼的實(shí)現(xiàn)16</p><p> 5.1客戶端與服務(wù)器的交互16</p><p> 5.2用戶與用戶之間聊天的實(shí)現(xiàn)17</p><p> 5.3 挑戰(zhàn)列表的實(shí)現(xiàn)22</p><p><b> 6 結(jié)論30</b></p><p><b> 致 謝31</b&g
8、t;</p><p><b> 緒論</b></p><p><b> 背景</b></p><p> 3G(第三代數(shù)字通訊技術(shù))正離我們的生活越來(lái)越近,它的到來(lái)必將掀起一陣無(wú)線通訊的新浪潮,3G是向未來(lái)個(gè)人通信演進(jìn)的一個(gè)重要發(fā)展階段,具有里程碑和劃時(shí)代的意義。</p><p> 說(shuō)到3G不
9、能不談到Android,[1]Android是Google于2007年11月5日宣布的基于Linux平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng)。它包括一個(gè)操作系統(tǒng),中間件和一些重要的應(yīng)用程序。它采用軟件堆層(Software Stack,又名軟件疊層)的架構(gòu),主要分為三部分。底層以Linux內(nèi)核工作為基礎(chǔ),由C語(yǔ)言開(kāi)發(fā),只提供基本功能;中間層包括函數(shù)庫(kù)Library和Dalvik虛擬機(jī),由C++開(kāi)發(fā)。最上層是各種應(yīng)用軟件,包括通話程序,短信程序等,應(yīng)用軟件
10、則由各公司自行開(kāi)發(fā),以Java作為編寫(xiě)程序的一部分。不存在任何以往阻礙移動(dòng)產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙,號(hào)稱是首個(gè)為移動(dòng)終端打造的真正開(kāi)放和完整的移動(dòng)軟件。這里,可以把a(bǔ)ndroid看作是一個(gè)類似于windows的操作系統(tǒng)。學(xué)習(xí)android平臺(tái)下的軟件開(kāi)發(fā)正如以前學(xué)習(xí)windows平臺(tái)下的軟件開(kāi)發(fā)一樣。[1]</p><p> 在國(guó)內(nèi),android的前景十分廣闊,國(guó)內(nèi)很多的廠商和運(yùn)營(yíng)商也紛紛加入了android陣營(yíng)
11、,包括中國(guó)移動(dòng),中國(guó)聯(lián)通,華為通訊,聯(lián)想等大企業(yè)。同時(shí)android應(yīng)用的范圍不僅僅在手機(jī),國(guó)內(nèi)一些廠家也陸續(xù)推出了采用android系統(tǒng)的MID產(chǎn)品,比較著名的包括由Rockchip和藍(lán)魔推出的同時(shí)具備高清播放和智能系統(tǒng)的音悅匯W7,我們可以預(yù)見(jiàn)android也將會(huì)被廣泛應(yīng)用在國(guó)產(chǎn)智能上網(wǎng)設(shè)備上,將進(jìn)一步擴(kuò)大Andorid系統(tǒng)的應(yīng)用范圍。</p><p> Android的崛起</p><
12、p> 【2】Android操作系統(tǒng)是Google最具殺傷力的武器之一。蘋(píng)果以其天才的創(chuàng)新,使得iphone在全球迅速擁有了數(shù)百萬(wàn)忠實(shí)粉絲,而Android作為第一個(gè)完整的,開(kāi)放,免費(fèi)的手機(jī)平臺(tái),使開(kāi)發(fā)者在為其開(kāi)發(fā)程序時(shí)擁有更大的自由。與Windows,Symbian等廠商不同的是,Android操作系統(tǒng)免費(fèi)向開(kāi)發(fā)人員提供,這樣可節(jié)省近三成的成本,得到了眾多廠商和開(kāi)發(fā)者的擁護(hù)?!?】最早進(jìn)入Android市場(chǎng)的宏達(dá)已經(jīng)陸續(xù)在一年內(nèi)
13、推出了G1,Magic,Hero,Tatto等4款手機(jī),三星也在2010年推出了Galaxyi7500,連摩托羅拉也推出了新款A(yù)ndroid手機(jī)Cliq,中國(guó)移動(dòng)也以Android為基礎(chǔ)開(kāi)發(fā)了Ophone平臺(tái)。這些發(fā)展證明Android已成為只能手機(jī)市場(chǎng)的重要發(fā)展趨勢(shì)。</p><p> [3]2010年是android平臺(tái)飛速發(fā)展的一年。據(jù)報(bào)道顯示,2011年8月Android已占據(jù)了全球智能手機(jī)市場(chǎng)的半壁江
14、山;而作為世界上零售領(lǐng)域最龐大的智能手機(jī)賣家蘋(píng)果公司,也以其iOS操作系統(tǒng)控制了五分之一的市場(chǎng)。換言之,Android和iOS加起來(lái)在全球智能手機(jī)市場(chǎng)上占據(jù)了三分之二的絕大多數(shù)市場(chǎng)份額。Android已經(jīng)在智能手機(jī)操作系統(tǒng)上占據(jù)著主導(dǎo)地位。這不難解釋,畢竟這樣一個(gè)完全免費(fèi)并開(kāi)放源代碼的平臺(tái)對(duì)于許多制造商來(lái)說(shuō)都極具吸引力。包括HTC、Samsung、Acer、Sony Ericsson、LG、Motorola等等一系列廠商都對(duì)其投入了極大
15、地關(guān)注和合作。[3]</p><p> 因此,2011年6月Google宣稱其每天激活50萬(wàn)Android設(shè)備,我們對(duì)這一消息并不會(huì)感到十分吃驚。這一數(shù)據(jù)雖然也包括平板電腦在內(nèi),但即便是這樣,它也仍然非??捎^。它不僅僅顯示了Android在制造商和消費(fèi)者間的普及度,同時(shí)還標(biāo)志著智能手機(jī)正在成為如今社會(huì)不可缺少的一部分。Andy是一個(gè)有遠(yuǎn)見(jiàn)的人,早在2003年他就看到了Android2005年的起步和被Googl
16、e的收購(gòu),也看到了系統(tǒng)的進(jìn)步和新的機(jī)型的快速的發(fā)布。所有的這一切都讓我們相信,Android走向世界第一移動(dòng)操作系統(tǒng)的寶座的步伐是勢(shì)不可擋的,Android可能真的會(huì)繼續(xù)帶著我們走向移動(dòng)設(shè)備夢(mèng)想的彼岸。</p><p><b> 國(guó)內(nèi)外研究現(xiàn)狀</b></p><p> Android 包括操作系統(tǒng)、用戶界面和應(yīng)用程序 —— 移動(dòng)電話工作所需的全部軟件,而且不存在
17、任何以往阻礙移動(dòng)產(chǎn)業(yè)創(chuàng)新的專有權(quán)障礙。Google與開(kāi)放手機(jī)聯(lián)盟合作開(kāi)發(fā)了 Android,這個(gè)聯(lián)盟由包括中國(guó)移動(dòng)、摩托羅拉、高通、宏達(dá)電和 T-Mobile 在內(nèi)的 30 多家技術(shù)和無(wú)線應(yīng)用的領(lǐng)軍企業(yè)組成。Google通過(guò)與運(yùn)營(yíng)商、設(shè)備制造商、開(kāi)發(fā)商和其他有關(guān)各方結(jié)成深層次的合作伙伴關(guān)系,希望借助建立標(biāo)準(zhǔn)化、開(kāi)放式的移動(dòng)電話軟件平臺(tái),在移動(dòng)產(chǎn)業(yè)內(nèi)形成一個(gè)開(kāi)放式的生態(tài)系統(tǒng)。</p><p> 【4】Androi
18、d 作為谷歌企業(yè)戰(zhàn)略的重要組成部分,將進(jìn)一步推進(jìn)"隨時(shí)隨地為每個(gè)人提供信息"這一企業(yè)目標(biāo)的實(shí)現(xiàn)。我們發(fā)現(xiàn),全球?yàn)閿?shù)眾多的移動(dòng)電話用戶從未使用過(guò)任何基于 Android 的電話。谷歌的目標(biāo)是讓(移動(dòng)通訊)不依賴于設(shè)備甚至平臺(tái)。出于這個(gè)目的,Android 將補(bǔ)充,而不會(huì)替代谷歌長(zhǎng)期以來(lái)奉行的移動(dòng)發(fā)展戰(zhàn)略:通過(guò)與全球各地的手機(jī)制造商和移動(dòng)運(yùn)營(yíng)商結(jié)成合作伙伴,開(kāi)發(fā)既有用又有吸引力的移動(dòng)服務(wù),并推廣這些產(chǎn)品。【4】</
19、p><p> 開(kāi)放手機(jī)聯(lián)盟的成立和 Android 的推出是對(duì)現(xiàn)狀的重大改變,在帶來(lái)初步效益之前,還需要不小的耐心和高昂的投入。但是,谷歌也在不斷努力,讓這些服務(wù)變得更好,同時(shí)也將添加更有吸引力的特性、應(yīng)用和服務(wù)。</p><p><b> 項(xiàng)目研究的主要內(nèi)容</b></p><p> 此游戲主要用到了Android用來(lái)畫(huà)圖的API,主類繼承
20、view類,重寫(xiě)其onDraw()方法并另起一個(gè)線程對(duì)主UI線程更新,實(shí)現(xiàn)整個(gè)游戲的動(dòng)態(tài)效果。其中自己寫(xiě)了很多算法來(lái)實(shí)現(xiàn)一些炫酷的效果。</p><p> 游戲主體框架的構(gòu)思,分為8大部分: com.hkdg.animation用來(lái)存放游戲中所用到的對(duì)ani動(dòng)畫(huà)的初始化及播放的類。 com.hkdg.game主要用來(lái)存放從服務(wù)器解析過(guò)來(lái)的數(shù)據(jù),也包括讀取的本地?cái)?shù)據(jù)。 com.hkdg.game.Music用來(lái)存
21、放游戲中音樂(lè),音效的初始化及播放的類。 com.hkdg.game.Object游戲中所用到的所有實(shí)體類存放在此。 com.hkdg.game.View游戲UI由若干自定義View組成,所有的View類存放于此。 com.hkdg.GameEngine此包中主要存放的是一個(gè)繼承了View的類,它另起了一個(gè)線程用來(lái)繪制界面,并同時(shí)更新主UI線程。 com.hkdg.Main這是一個(gè)存放著幾個(gè)Activity的包,游戲中為數(shù)不多的幾個(gè)act
22、ivity都存放于此。 com.hkdg.tools這是一個(gè)存放著工具類的工具包。</p><p><b> 本章小結(jié)</b></p><p> 本章主要對(duì)Android的發(fā)展歷程以及對(duì)本游戲內(nèi)容進(jìn)行了簡(jiǎn)單的闡述,為Android開(kāi)發(fā)者提供一個(gè)參考。</p><p> Android的開(kāi)發(fā)環(huán)境</p><p>
23、Android操作系統(tǒng)</p><p> 目前只支持XP(32-bit)、Vista(32/64-bit)、Mac OS X 10.4.8或更新版本(x86),Linux(只在Linux Ubuntu Dapper Drake上面做過(guò)測(cè)試)。 系統(tǒng)XP sp2/sp3 32bit 來(lái)做講解,其他系統(tǒng)的可以google一下差異,反正都大同小異的。</p><p> Android開(kāi)發(fā)環(huán)境
24、</p><p> 建議使用eclipse進(jìn)行開(kāi)發(fā),當(dāng)然,eclipse版本要在3.3以上,這是官方說(shuō)法,3.3以下我也沒(méi)測(cè)過(guò),3.3 (Europa)、3.4 (Ganymede) 都可以java版本或者EE版本也都沒(méi)問(wèn)題的,可以到eclipse官方下載最新版本。因?yàn)殚_(kāi)發(fā)是基于java的,所以jdk是少不了的,jdk要求是5.0或者6.0,我還是用5.0比較多,可以到sun官方下載。</p>&
25、lt;p> Android開(kāi)發(fā)環(huán)境變量的配置</p><p><b> JDK的配置</b></p><p> 首先要到sun官方下載jdk,注意的是下載jdk而不是下載jre,因?yàn)閖re是提供java的運(yùn)行環(huán)境而不是開(kāi)發(fā)環(huán)境。sun官方網(wǎng)站是:http://java.sun.com 下載后安裝是下的解壓包那就解壓到某目錄,例如解壓到是C:\Program
26、 Files\Java\jdk1.5.0_14 右鍵點(diǎn)擊我的電腦 -> 屬性 -> 高級(jí),點(diǎn)擊下面的環(huán)境變量,在下面的“系統(tǒng)變量”處選擇新建在變量名處輸入 JAVA_HOME變量值中輸入剛才的目錄,比如C:\Program Files\Java\jdk1.5.0_14 。效果如圖2-1所示:</p><p> 圖2-3-1-1 進(jìn)入環(huán)境變量</p><p> 確定后再新建一
27、個(gè)變量名為classpath,變量值為 %JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/tools.jar , 確定后找到PATH的變量,雙擊或點(diǎn)擊編輯,在變量值最前面加上%JAVA_HOME%/bin; 注意里面的是,確定、確定、確定后即可。具體如下圖2-2所示</p><p> 圖2-3-1-2 環(huán)境變量的配置</p><p> 然后開(kāi)始 - 運(yùn)行 c
28、md,輸入java或者javac看看有沒(méi)有效果,如果出來(lái)一大堆其它的東西,那就好了,如果出現(xiàn)類似xxx不是內(nèi)部或者是外部命令之類的,那就說(shuō)明你的設(shè)置有問(wèn)題,看看那里出問(wèn)題然后加以改正。</p><p><b> SDK的配置</b></p><p> 因?yàn)槲覀円_(kāi)發(fā)的android應(yīng)用程序,所以下的sdk是Google那里下載,地址在http://develope
29、r.android.com/sdk/1.5_r3/index.html 以后更新后估計(jì)地址會(huì)變,所以大家可以從http://developer.android.com/index.html進(jìn)入android主頁(yè),然后點(diǎn)擊sdk就到了這個(gè)下載頁(yè)面,我是XP,當(dāng)然下載了第一個(gè)Windows的版本。下載后解壓到一個(gè)目錄,如D:\SDK\android-sdk-windows-1.5_r3\android-sdk-windows-1.5_r3
30、然后同樣要設(shè)置環(huán)境變量,同jdk設(shè)置,新建一個(gè)SDK_HOME,值為D:\SDK\android-sdk-windows-1.5_r3\android-sdk-windows-1.5_r3 ,然后找到path,在前面加上%SDK_HOME%\tools; 就OK了。和jdk一樣,我們也可以測(cè)試一下環(huán)境變量是否設(shè)置成功,cmd窗口中輸入android,出現(xiàn)一堆東西,就完成了。</p><p> Eclipse的配
31、置</p><p> 當(dāng)然,以上都搞定后,還不能馬上用eclipse開(kāi)發(fā)android應(yīng)用程序,還必須添加eclipse插件才行,幸好這步驟非常輕松,打開(kāi)eclipse后,點(diǎn)擊菜單欄的help -> install new software... 然后點(diǎn)擊Add會(huì)出來(lái)一個(gè)Add Site的窗口,這里Name輸入android(自己取個(gè)就是了),location中輸入插件的網(wǎng)絡(luò)地址: https://dl-
32、ssl.google.com/android/eclipse/然后就等待連接了,然后install,把"Android DDMS" 和 "Android Development Tools"都選中,finish就可以了,可能有段時(shí)間會(huì)去計(jì)算插件占用資源情況,慢慢等會(huì)。完成后會(huì)提示重啟eclipse來(lái)加載插件,ok重啟,就可以用了。</p><p><b> 本章
33、小結(jié)</b></p><p> 本章將主要介紹如何構(gòu)建Android開(kāi)發(fā)環(huán)境,包括獲取Android SDK、Eclipse以及進(jìn)行Android Eclipse插件設(shè)置等。</p><p> Android應(yīng)用程序核心</p><p><b> 應(yīng)用程序基礎(chǔ)</b></p><p> Android
34、的應(yīng)用程序全部都是用Java編程語(yǔ)言所寫(xiě)的。編譯后的Java代碼——包括應(yīng)用程序要求的任何數(shù)據(jù)和資源文件,是通過(guò)aapt工具捆綁成一個(gè)Android包,歸檔文件是以.apk為后綴。這個(gè)文件是分發(fā)應(yīng)用程序和安裝到移動(dòng)設(shè)備的中介或者是工具,用戶下載這個(gè)文件到他們自己的設(shè)備上。一個(gè).apk文件中的所有代碼就會(huì)被認(rèn)為是一個(gè)應(yīng)用程序。 </p><p> aapt是Android Asset Packaging Tool
35、的首寫(xiě)字母的縮寫(xiě),這個(gè)工具包是含在SDK</p><p> 的tools/目錄下的。查看、創(chuàng)建、更新與zip兼容的歸檔文件(zip、jar、apk)。它也能將資源文件編譯成二進(jìn)制包。 </p><p> 雖然你可能不會(huì)經(jīng)常直接使用appt,但構(gòu)建腳本(build scripts)和IDE插件會(huì)使用這個(gè)工具打包成apk文件,構(gòu)成一個(gè)Android的應(yīng)用程序。 </p>&l
36、t;p> 下面是更詳細(xì)的使用細(xì)節(jié),[5]首先打開(kāi)一個(gè)終端,進(jìn)入tools/目錄下,運(yùn)行命令: Linux或Mac操作系統(tǒng):./aapt ,如果是Windows:aapt.exe 。在這里注意的是:tools/目錄指的是android SDK目錄下的/platforms/android-X/tools/。在很多的方面,每個(gè)Android的應(yīng)用程序是生活在它自己的世界。默認(rèn)的情況下,任何一個(gè)應(yīng)用程序是運(yùn)行在它自己的Linux進(jìn)程中。
37、而當(dāng)應(yīng)用程序中的任何代碼需要被執(zhí)行時(shí)候,Android將啟動(dòng)進(jìn)程;當(dāng)它不再需要和系統(tǒng)資源不會(huì)被其他應(yīng)用程序所請(qǐng)求時(shí),Android就會(huì)關(guān)閉這個(gè)進(jìn)程。每一個(gè)應(yīng)用程序都有自己的Java虛擬機(jī)(VM),所以應(yīng)用程序的代碼是獨(dú)立于其他所有的應(yīng)用程序代碼的運(yùn)行。在默認(rèn)情況下,每一個(gè)應(yīng)用程序分配一個(gè)唯一的Linux用戶ID。權(quán)限被設(shè)置為每一個(gè)應(yīng)用程序的文件僅對(duì)用戶和應(yīng)用程序自己本身可見(jiàn)。雖然有一些方法也可以暴露他們給其他應(yīng)用程序。也有可能的是設(shè)置兩
38、個(gè)應(yīng)用程序共享一個(gè)用戶ID,這種情況下,他們能夠看到對(duì)方的文件。為了節(jié)省系統(tǒng)資源的占用,具有相同ID的應(yīng)用程序最好可以安排在同一個(gè)Linu</p><p><b> 應(yīng)用程序組件</b></p><p><b> Acitivity</b></p><p> Activity是Android組件中最基本也是最為常見(jiàn)的
39、組件,在一個(gè)Android應(yīng)用中,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕。當(dāng)Activity從一種狀態(tài)轉(zhuǎn)變到另一種狀態(tài)時(shí),會(huì)調(diào)用以下保護(hù)方法來(lái)通知這種變化:</p><p> void onCreate(Bundle savedInstanceState)</p><p> void onStart()</p><p> void onRestart()v
40、oid onResume()</p><p> void onPause()void onStop()</p><p> void onDestroy()</p><p> 【6】下圖為Activity的生命周期圖示:</p><p> 圖3-2-1 Activity的生命周期圖示[6]</p><p> 在
41、實(shí)現(xiàn) Activity 類的時(shí)候,通過(guò)覆蓋( override )這些方法即可在你需要處理的時(shí)候來(lái)調(diào)用。</p><p> onCreate :當(dāng)活動(dòng)第一次啟動(dòng)的時(shí)候,觸發(fā)該方法,可以在此時(shí)完成活動(dòng)的初始化工作。onCreate 方法有一個(gè)參數(shù),該參數(shù)可以為空( null ),也可以是之前調(diào)用onSaveInstanceState ()方法保存的狀態(tài)信息。</p><p> onSta
42、rt :該方法的觸發(fā)表示所屬活動(dòng)將被展現(xiàn)給用戶。</p><p> onResume :當(dāng)一個(gè)活動(dòng)和用戶發(fā)生交互的時(shí)候,觸發(fā)該方法。</p><p> onPause :當(dāng)一個(gè)正在前臺(tái)運(yùn)行的活動(dòng)因?yàn)槠渌幕顒?dòng)需要前臺(tái)運(yùn)行而轉(zhuǎn)入后臺(tái)運(yùn)行的時(shí)候,觸發(fā)該方法。這時(shí)候需要將活動(dòng)的狀態(tài)持久化,比如正在編輯的數(shù)據(jù)庫(kù)記錄等。</p><p> onStop :當(dāng)一個(gè)活動(dòng)不再
43、需要展示給用戶的時(shí)候,觸發(fā)該方法。如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng),而不會(huì)觸發(fā) onStop 方法。 所以保存狀態(tài)信息是應(yīng)該在onPause時(shí)做,而不是onStop時(shí)做?;顒?dòng)如果沒(méi)有在前臺(tái)運(yùn)行,都將被停止或者Linux管理進(jìn)程為了給新的活動(dòng)預(yù)留足夠的存儲(chǔ)空間而隨時(shí)結(jié)束這些活動(dòng)。因此對(duì)于開(kāi)發(fā)者來(lái)說(shuō),在設(shè)計(jì)應(yīng)用程序的時(shí)候,必須時(shí)刻牢記這一原則。在一些情況下,onPause方法或許是活動(dòng)觸發(fā)的最后的方法,因此開(kāi)發(fā)者需要在這個(gè)時(shí)候保存需要保
44、存的信息。</p><p> onRestart :當(dāng)處于停止?fàn)顟B(tài)的活動(dòng)需要再次展現(xiàn)給用戶的時(shí)候,觸發(fā)該方法。</p><p> onDestroy :當(dāng)活動(dòng)銷毀的時(shí)候,觸發(fā)該方法。和onStop 方法一樣,如果內(nèi)存緊張,系統(tǒng)會(huì)直接結(jié)束這個(gè)活動(dòng)而不會(huì)觸發(fā)該方法。</p><p> onSaveInstanceState :系統(tǒng)調(diào)用該方法,允許活動(dòng)保存之前的狀態(tài)
45、,比如說(shuō)在一串字符串中的光標(biāo)所處的位置等。</p><p> 通常情況下,開(kāi)發(fā)者不需要重寫(xiě)覆蓋該方法,在默認(rèn)的實(shí)現(xiàn)中,已經(jīng)提供了自動(dòng)保存活動(dòng)所涉及到的用戶界面組件的所有狀態(tài)信息。</p><p><b> Service</b></p><p> Service是一種長(zhǎng)生命周期,沒(méi)有用戶界面的程序。</p><p>
46、; Service是android 系統(tǒng)中的一種組件,它跟Activity的級(jí)別差不多,但是他不能自己運(yùn)行,只能后臺(tái)運(yùn)行,并且可以和其他組件進(jìn)行交互。Service的啟動(dòng)有兩種方式:context.startService()和context.bindService()。</p><p> 【7】使用context.startService() 啟動(dòng)Service是會(huì)經(jīng)歷:context.startServi
47、ce() ->onCreate()- >onStart()->Service running context.stopService() | ->onDestroy() ->Service stop如果Service還沒(méi)有運(yùn)行,則android先調(diào)用onCreate()然后調(diào)用onStart();如果Service已經(jīng)運(yùn)行,則只調(diào)用onStart(),所以一個(gè)Service的onStart方法可能會(huì)重復(fù)調(diào)用
48、多次。stopService的時(shí)候直接onDestroy,如果是調(diào)用者自己直接退出而沒(méi)有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。該Service的調(diào)用者再啟動(dòng)起來(lái)后可以通過(guò)stopService關(guān)閉Service。 所以調(diào)用startService的生命周期為:onCreate --> onStart(可多次調(diào)用) --> onDestroy 使用使用context.bindService()
49、啟動(dòng)Service會(huì)經(jīng)歷: context</p><p> BroadcastReciver</p><p> BrodcastReciver是為了實(shí)現(xiàn)系統(tǒng)廣播而提供的組件。</p><p> 在android下,要想接受廣播信息,那么這個(gè)廣播接收器就得我們自己來(lái)實(shí)現(xiàn)了,我們可以繼承BroadcastReceiver,就可以有一個(gè)廣播接受器了。有個(gè)接受器還不
50、夠,我們還得重寫(xiě)B(tài)roadcastReceiver里面的onReceiver方法,當(dāng)來(lái)廣播的時(shí)候我們要干什么,這就要我們自己來(lái)實(shí)現(xiàn)。具體的代碼:</p><p> public class SmsBroadCastReceiver extends BroadcastReceiver </p><p><b> { </b></p>
51、<p> @Override </p><p> public void onReceive(Context context, Intent intent) </p><p><b> { </b></p><p> Bundle bundle = intent.getExtras();
52、 </p><p> //這里寫(xiě)你要做的事情 </p><p> } </p><p><b> } </b></p><p> 我們可以把廣播接收器注冊(cè)到系統(tǒng)里面,可以讓系統(tǒng)知道我們有個(gè)廣播接收器。這里有兩種,一種是代碼動(dòng)態(tài)注冊(cè):</p><p>
53、; //生成廣播處理 </p><p> smsBroadCastReceiver = new SmsBroadCastReceiver(); </p><p> //實(shí)例化過(guò)濾器并設(shè)置要過(guò)濾的廣播 </p><p> IntentFilter intentFilter = new IntentFilter("android.provid
54、er.Telephony.SMS_RECEIVED"); </p><p><b> //注冊(cè)廣播 </b></p><p> BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter); </p><p>
55、 //onDestroy要注銷廣播 </p><p> 調(diào)用unregisterReceiver(..)函數(shù); </p><p> 一種是在AndroidManifest.xml中配置廣播 </p><p> <?xml version="1.0" encoding="utf-8"?> <
56、/p><p> <manifest xmlns:android="http://schemas.android.com/apk/res/android" </p><p> package="spl.broadCastReceiver" </p><p> android:versionCode="1&q
57、uot; </p><p> android:versionName="1.0"> </p><p> <application android:icon="@drawable/icon" android:label="@string/app_name"> </p><p>
58、 <activity android:name=".BroadCastReceiverActivity" </p><p> android:label="@string/app_name"> </p><p> <intent-filter> </p><p> <action
59、 android:name="android.intent.action.MAIN" /> </p><p> <category android:name="android.intent.category.LAUNCHER" /> </p><p> </intent-filter> </p>
60、;<p> </activity> </p><p> <!--廣播注冊(cè)--> </p><p> <receiver android:name=".SmsBroadCastReceiver"> </p><p> <intent-filter android:prior
61、ity="20"> </p><p> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </p><p> </intent-filter> </p><p> </receiver>
62、 </p><p> </application> </p><p> <uses-sdk android:minSdkVersion="7" /> </p><p> <!-- 權(quán)限申請(qǐng) --> </p><p> <uses-permission a
63、ndroid:name="android.permission.RECEIVE_SMS"></uses-permission> </p><p> </manifest> </p><p> 兩種注冊(cè)類型的區(qū)別是:</p><p> 1)第一種不是常駐型廣播,也就是說(shuō)廣播跟隨程序的生命周期。</
64、p><p> 2)第二種是常駐型,也就是說(shuō)當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來(lái),程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行。</p><p> ContentProvider</p><p> ContentProvider可以實(shí)現(xiàn)不同組件之間的數(shù)據(jù)共享。</p><p> ContentProvider:為存儲(chǔ)和獲取數(shù)據(jù)提供統(tǒng)一的接口??梢栽诓煌膽?yīng)用程
65、序之間共享數(shù)據(jù)。Android已經(jīng)為常見(jiàn)的一些數(shù)據(jù)提供了默認(rèn)的ContentProvider1、ContentProvider使用表的形式來(lái)組織數(shù)據(jù) 無(wú)論數(shù)據(jù)的來(lái)源是什么,ContentProvider都會(huì)認(rèn)為是一種表,然后把數(shù)據(jù)組織成表格2、ContentProvider提供的方法 query:查詢 insert:插入 update:更新 delete:刪除 getType:得到數(shù)據(jù)類型 onCreate:創(chuàng)建數(shù)據(jù)時(shí)
66、調(diào)用的回調(diào)函數(shù)3、每個(gè)ContentProvider都有一個(gè)公共的URI,這個(gè)URI用于表示這個(gè)ContentProvider所提供的數(shù)據(jù)。Android所提供的ContentProvider都存放在android.provider包當(dāng)中二、ContentProvider的內(nèi)部原理自定義一個(gè)ContentProvider,來(lái)實(shí)現(xiàn)內(nèi)部原理步驟:1、定義一個(gè)CONTENT_URI常量(里面的字符串必須是唯一)</p>
67、<p> Public static final Uri CONTENT_URI = Uri.parse("content://com.WangWeiDa.MyContentprovider");</p><p> 如果有子表,URI為:</p><p> Public static final Uri CONTENT_URI = Uri.parse(
68、"content://com.WangWeiDa.MyContentProvider/users");</p><p> 2、定義一個(gè)類,繼承ContentProviderPublic class MyContentProvider extends ContentProvider</p><p><b> 本章小結(jié)</b></p>
69、;<p> 本章將會(huì)詳細(xì)敘述Android的應(yīng)用程序所包括的基本組件,還有這些組件之間的溝通方式—Intent(除了Contentprovider),同時(shí)講解一下Android應(yīng)用程序的生命周期(Activity)—這是其他智能收與Android手機(jī)平臺(tái)最顯著不同的地方。最后將介紹在Android的應(yīng)用程序中如何利用下載外部資源。</p><p><b> 項(xiàng)目相設(shè)計(jì)</b>
70、;</p><p><b> 研究目的</b></p><p> 了解Android網(wǎng)絡(luò)游戲的設(shè)計(jì),開(kāi)發(fā)過(guò)程和后期的項(xiàng)目維護(hù);</p><p> 了解smartFoxServer的使用和其API的使用;</p><p> 能夠更加熟練的使用開(kāi)發(fā)軟件與真機(jī)調(diào)試</p><p><b&g
71、t; 需求分析</b></p><p> 通過(guò)與多位玩家進(jìn)行全面深入地探討和分析,并完成《江湖行-風(fēng)云再現(xiàn)》市場(chǎng)的前期調(diào)查后,提出了游戲需求分析說(shuō)明書(shū)。</p><p> 此需求分析說(shuō)明書(shū)對(duì)《江湖行-風(fēng)云再現(xiàn)》游戲做了全面細(xì)致的用戶需求分析,明確所要開(kāi)發(fā)的游戲軟件應(yīng)具有的功能、性能與界面,使系統(tǒng)分析人員及軟件開(kāi)發(fā)人員能清楚地了解玩家的需求,并在此基礎(chǔ)上進(jìn)一步提出概要設(shè)計(jì)說(shuō)
72、明書(shū)和完成后續(xù)設(shè)計(jì)與開(kāi)發(fā)工作。</p><p> 本說(shuō)明書(shū)的預(yù)期讀者為客戶、業(yè)務(wù)或需求分析人員、測(cè)試人員、用戶文檔編寫(xiě)者、項(xiàng)目管理人員。</p><p><b> 游戲界面設(shè)置</b></p><p> 《江湖行-風(fēng)云再現(xiàn)》這款A(yù)ndroid系統(tǒng)下的手機(jī)網(wǎng)絡(luò)游戲,簡(jiǎn)單易于操作,交互性好,界面美觀布局清晰,大致分為5個(gè)部分:</p&g
73、t;<p> 4.3.1 等登陸界面</p><p> 登陸界面主要是實(shí)現(xiàn)玩家的登陸,注冊(cè),及修改資料功能</p><p> 4.3.2 游戲主界面</p><p> 游戲主界面主要是對(duì)游戲的整體畫(huà)面與游戲功能繪制</p><p> 4.3.3 玩家升級(jí)Pk與做任務(wù)的界面</p><p> 玩
74、家主要是通過(guò)與別的玩家pK和做任務(wù)來(lái)升級(jí)</p><p> 4.3.4 購(gòu)買(mǎi)物品與地產(chǎn)的界面</p><p> 玩家可以通過(guò)在武器店購(gòu)買(mǎi)裝備來(lái)提升自己的戰(zhàn)斗力,也可以在黑點(diǎn)里花錢(qián)買(mǎi)元寶和恢復(fù)血,能力和氣,玩家可以在生意那里購(gòu)買(mǎi)地產(chǎn)來(lái)賺得額外的銀兩</p><p> 4.3.5 玩家之間的聊天界面與發(fā)送系統(tǒng)消息與世界消息的界面</p><p&
75、gt; 主要是實(shí)現(xiàn)玩家之間的聊天與在系統(tǒng)頻道和世界頻道發(fā)送要顯示的消息 </p><p><b> 游戲體系設(shè)計(jì)</b></p><p> 此軟件主要針對(duì)客戶端設(shè)計(jì)的,由于玩家的登陸,將玩家信息存進(jìn)服務(wù)器,通過(guò)smartFoxServer來(lái)進(jìn)行客戶端與服務(wù)器的交互,具體實(shí)現(xiàn)是客戶端發(fā)出請(qǐng)求指令并傳送相關(guān)信息
76、,服務(wù)器發(fā)出回復(fù)指令并返回對(duì)應(yīng)信息給用戶。將玩家的消息,在游戲界面上顯示給玩家看,玩家可以選擇不同的操作,來(lái)向服務(wù)器發(fā)出不同的指令,服務(wù)器根據(jù)玩家發(fā)來(lái)的不同指令對(duì)應(yīng)著不同的接口,然后相應(yīng)的的給予回復(fù)。</p><p><b> 計(jì)代碼的實(shí)現(xiàn)</b></p><p> 5.1客戶端與服務(wù)器的交互</p><p> 通過(guò)smartFoxSer
77、ver來(lái)進(jìn)行交互的,用戶發(fā)出請(qǐng)求指令和信息,服務(wù)器響應(yīng)發(fā)出回復(fù)指令和信息</p><p> public SmartFox sfsClient;</p><p> public void initSmartFox() {//服務(wù)器的初始化和銷毀</p><p> sfsClient = new SmartFox(true);</p><p&
78、gt; sfsClient.setDebug(false);</p><p> sfsClient.addEventListener(SFSEvent.CONNECTION,this);</p><p> sfsClient.addEventListener(SFSEvent.CONNECTION_LOST, this);</p><p> sfsClien
79、t.addEventListener(SFSEvent.LOGIN, this);</p><p> sfsClient.addEventListener(SFSEvent.ROOM_JOIN, this);</p><p> sfsClient.addEventListener(SFSEvent.EXTENSION_RESPONSE, this);</p><p&
80、gt;<b> }</b></p><p> public void destroy() {</p><p> if (sfsClient != null) {</p><p> sfsClient.removeEventListener(SFSEvent.CONNECTION, this);sfsClient.removeEven
81、tListener(SFSEvent.CONNECTION_LOST, this);</p><p> sfsClient.removeEventListener(SFSEvent.LOGIN, this);</p><p> sfsClient.removeEventListener(SFSEvent.ROOM_JOIN, this);</p><p> s
82、fsClient.removeEventListener(SFSEvent.HANDSHAKE, this);</p><p> sfsClient.disconnect();</p><p><b> }</b></p><p><b> }</b></p><p> 客戶端向服務(wù)器發(fā)送請(qǐng)
83、求指令實(shí)現(xiàn)的方法(買(mǎi)物品的請(qǐng)求)</p><p> Public void requestBuyProduct(int productID,int productType){</p><p> ISFSObject params = new SFSObject();</p><p> params.putLong(Keys.PLAYER.PLAYERID, G
84、ameData.roleData.id);</p><p> params.putInt(Keys.PRODUCTID, productID);</p><p> params.putInt(Keys.TYPE, productType);</p><p> sfsClient.send(new ExtensionRequest(SRequest.NdBuyP
85、roduct,</p><p><b> params));</b></p><p> game.gameView.sleep(200);</p><p><b> }</b></p><p> 服務(wù)器響應(yīng)客戶端發(fā)出指令實(shí)現(xiàn)的方法</p><p> public v
86、oid responsePickUpEveryDay(){//獲取游戲幣</p><p> ISFSObject io = NdObj.getSFSObject(SResponse.UPDATE_PLAYER);</p><p> String tip = io.getUtfString(Keys.HINT);</p><p> GameData.roleDa
87、ta.login++;</p><p> if(tip.length() > 0){</p><p> game.gameView.loadProgress.sendMessage(LoadProgress.ShowText, tip);</p><p><b> }</b></p><p> Game
88、Data.roleData.totalGold = io.getLong(Keys.PLAYER.GOLD);</p><p> SFSConnect.isGetLogin = false;</p><p><b> }</b></p><p> 5.2用戶與用戶之間聊天的實(shí)現(xiàn)</p><p> 本段代碼主要是實(shí)
89、現(xiàn)用戶與用戶之間的聊天功能以及聊天內(nèi)容的繪制,用戶發(fā)送信息給其他用戶時(shí),系統(tǒng)先調(diào)用發(fā)送信息指令向服務(wù)器發(fā)送請(qǐng)求,并將用戶的信息以及用戶的個(gè)人信息保存在本地,服務(wù)器接受到指令后,根據(jù)用戶信息的內(nèi)容(主要是對(duì)方ID)將發(fā)出響應(yīng)指令給對(duì)方,本地保存的信息也一并發(fā)給對(duì)方。</p><p> public class PersonChatView {</p><p> private Vecto
90、r<PriLetter> letters=new Vector<PriLetter>();</p><p> private int screenH;</p><p> private int onTouchY;</p><p> private Bitmap inputWindow;</p><p> pri
91、vate Bitmap sendIcon;</p><p> private GamePlay game;</p><p> private CRect inputRect = new CRect();</p><p> private CRect sendRect = new CRect();</p><p> private CR
92、ect contentRect = new CRect();</p><p> private long id;</p><p> public PersonChatView(GamePlay game){</p><p> this.game = game;</p><p><b> }</b></p&g
93、t;<p> public void init(long id){</p><p> this.id = id;</p><p> letters.removeAllElements();//從letter中找到交流的內(nèi)容</p><p> for(int i = 0;i< JHXFactory.letters.size();i++){
94、</p><p> PriLetter letter= JHXFactory.letters.elementAt(i);</p><p> if(letter.reciverID == id || letter.senderID == id || letter.uin.equalsIgnoreCase(game.player.uin)){</p><p> l
95、etters.add(letter);</p><p><b> }</b></p><p><b> }</b></p><p> contentRect.set(0,180,480,618);</p><p> inputWindow=game.imaManager.createAsse
96、tsBitmap("talkbg");</p><p> sendIcon=game.imaManager.createAssetsBitmap("sendtalk");}</p><p> public void destroy(){</p><p> if(inputWindow != null &&
97、 !inputWindow.isRecycled()){</p><p> inputWindow.recycle();</p><p><b> }</b></p><p> inputWindow = null;</p><p> if(sendIcon != null && !sendIco
98、n.isRecycled()){</p><p> sendIcon.recycle();</p><p><b> }</b></p><p> sendIcon = null;</p><p><b> }</b></p><p> String str;<
99、;/p><p> String[] strArr;</p><p> public void paint(Canvas canvas ,Paint paint){</p><p> canvas.drawBitmap(game.state.menuBg, 0,145, paint</p><p> int y = 200-screenH
100、;</p><p> canvas.save();</p><p> canvas.clipRect(contentRect.toRect());</p><p> for(int i = 0;i< letters.size();i++){</p><p> PriLetter letter = letters.elementA
101、t(i);</p><p> if(letter.senderID == GameData.roleData.id){//靠右邊繪制</p><p> str = letter.senderName + " "+letter.sendDate;</p><p> Constant.textPaint.setColor(Color.CYAN)
102、;</p><p> Constant.textPaint.setTextAlign(Align.RIGHT);</p><p> Constant.textPaint.setTextSize(Constant.S_Font);</p><p> canvas.drawText(str, Constant.CANVAS_WIDTH - 20, y, Const
103、ant.textPaint);</p><p><b> y+= 20;</b></p><p><b> //繪制內(nèi)容</b></p><p> Constant.textPaint.setTextSize(Constant.M_Font);</p><p> Constant.textP
104、aint.setColor(0xff632b09);</p><p> int end,start = 0;</p><p> int length = letter.content.length();</p><p> while(true){</p><p> end = start + 16;</p><p&
105、gt; if(end >= length){</p><p> str = letter.content.substring(start);</p><p> canvas.drawText(str, Constant.CANVAS_WIDTH - 35, y, Constant.textPaint);</p><p><b> y+= 20
106、;</b></p><p><b> break;</b></p><p><b> }else{</b></p><p> str = letter.content.substring(start,end);</p><p> canvas.drawText(str, Cons
107、tant.CANVAS_WIDTH - 35, y, Constant.textPaint);</p><p><b> y+= 20;</b></p><p><b> }</b></p><p> start = end;</p><p><b> }</b><
108、;/p><p> Constant.textPaint.setTextAlign(Align.CENTER);</p><p> canvas.drawText("--------------------------------------------------------------------------", Constant.CANVAS_WIDTH >&
109、gt; 1, y, Constant.textPaint);</p><p><b> y+=20;</b></p><p> }else {//靠左邊繪制</p><p> str = letter.senderName + " "+letter.sendDate;</p><p> Con
110、stant.textPaint.setTextAlign(Align.LEFT);</p><p> Constant.textPaint.setTextSize(Constant.S_Font);</p><p> Constant.textPaint.setColor(0xff03038d);</p><p> canvas.drawText(str, 2
111、0, y, Constant.textPaint);</p><p><b> y+= 20;</b></p><p><b> //繪制內(nèi)容</b></p><p> Constant.textPaint.setTextSize(Constant.M_Font);</p><p> int
112、 end,start = 0;</p><p> int length = letter.content.length();</p><p> Constant.textPaint.setColor(0xff632b09);</p><p> while(true){</p><p> end = start + 16;</p&
113、gt;<p> if(end >= length){</p><p> end = length;</p><p> str = letter.content.substring(start);</p><p> canvas.drawText(str, 35, y, Constant.textPaint);</p><
114、;p><b> y+= 20;</b></p><p><b> break;</b></p><p><b> }else{</b></p><p> str=letter.content.substring(start,end);</p><p> canv
115、as.drawText(str, 35, y, Constant.textPaint);</p><p><b> y+= 20;</b></p><p><b> }</b></p><p> start = end;</p><p><b> }</b></p
116、><p><b> //繪制虛線</b></p><p> Constant.textPaint.setTextAlign(Align.CENTER);</p><p> canvas.drawText("----------------------------------------------------------------
117、----------", Constant.CANVAS_WIDTH >> 1, y, Constant.textPaint);</p><p><b> y+=20;</b></p><p><b> }</b></p><p><b> }</b></p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文--基于android操作系統(tǒng)的飛機(jī)大戰(zhàn)手機(jī)游戲
- 基于android操作系統(tǒng)的足球小將手機(jī)游戲畢業(yè)論文
- 基于android操作系統(tǒng)的飛機(jī)大戰(zhàn)手機(jī)游戲畢業(yè)論文(設(shè)計(jì))
- 畢業(yè)論文-基于android操作系統(tǒng)的中國(guó)象棋手機(jī)游戲
- android操作系統(tǒng)簡(jiǎn)介
- 畢業(yè)論文----淺談linux操作系統(tǒng)的安全
- 淺談linux操作系統(tǒng)的安全畢業(yè)論文
- android 操作系統(tǒng)的介紹
- 畢業(yè)論文-實(shí)時(shí)操作系統(tǒng)設(shè)計(jì)【精校排版】
- 畢業(yè)論文---用flash制作《網(wǎng)絡(luò)操作系統(tǒng)》課件
- 智能手機(jī)的操作系統(tǒng)畢業(yè)論文
- 礦主井裝載操作系統(tǒng)的設(shè)計(jì)畢業(yè)論文
- 智能手機(jī)的操作系統(tǒng)畢業(yè)論文
- 操作系統(tǒng)文件管理算法研究畢業(yè)論文
- 操作系統(tǒng)文件管理算法研究畢業(yè)論文
- 淺談操作系統(tǒng)(操作系統(tǒng)論文)
- 畢業(yè)論文---一個(gè)簡(jiǎn)易操作系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)遠(yuǎn)程考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 畢業(yè)論文---一個(gè)簡(jiǎn)易操作系統(tǒng)的實(shí)現(xiàn)
- 一個(gè)簡(jiǎn)易操作系統(tǒng)的實(shí)現(xiàn)畢業(yè)論文
評(píng)論
0/150
提交評(píng)論