版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 信息工程學(xué)院本科生畢業(yè)設(shè)計說明書</p><p> 題目:基于Android的天氣短信系統(tǒng)的設(shè)計與實現(xiàn) </p><p><b> 目 錄</b></p><p><b> 1 系統(tǒng)概述1</b></p><p> 1.1 設(shè)計目的
2、1</p><p> 1.2 設(shè)計思路1</p><p> 1.3系統(tǒng)需求分析1</p><p><b> 1.4開發(fā)環(huán)境2</b></p><p> 1.4.1 Android開發(fā)環(huán)境的介紹2</p><p> 1.4.2 Android的開發(fā)平臺搭建2</p>
3、<p> 1.5 運行環(huán)境3</p><p> 1.6 參考文獻(xiàn)3</p><p><b> 2.總體設(shè)計4</b></p><p><b> 2.1系統(tǒng)結(jié)構(gòu)4</b></p><p> 2.1.1 系統(tǒng)流程圖4</p><p> 2.1.
4、2 模塊結(jié)構(gòu)圖4</p><p> 2.2數(shù)據(jù)庫的設(shè)計5</p><p> 2.3 模塊功能設(shè)計6</p><p> 2.3.1 獲取當(dāng)前天氣功能6</p><p> 2.3.2 選擇城市的功能6</p><p> 2.3.3 發(fā)送短信的功能6</p><p><b&
5、gt; 3.運行設(shè)計7</b></p><p> 3.1用戶界面設(shè)計7</p><p> 3.2 運行代碼9</p><p><b> 4.系統(tǒng)測試25</b></p><p> 4.1功能性測試25</p><p> 4.2 穩(wěn)定性測試27</p>
6、<p> 4.3 安全性測試27</p><p><b> 5 結(jié)論28</b></p><p> 1 系統(tǒng)概述 </p><p> 近幾年來隨著3G 技術(shù)成熟和智能手機的不斷普及,移動應(yīng)用的需求與日俱增,移動應(yīng)用開發(fā)成為當(dāng)下最熱門的技術(shù)之一。在Google和Android 手機聯(lián)盟的共同推動下,Android在
7、眾多移動應(yīng)用開發(fā)平臺中脫穎而出。Android是一個真正意義上的開源智能手機操作系統(tǒng),該系統(tǒng)一經(jīng)推出立即受到全球移動設(shè)備廠商和開發(fā)者的熱捧。為順應(yīng)潮流,本設(shè)計旨在搭載 Android 的移動設(shè)備上運行,實現(xiàn)天氣狀況的實時動態(tài)更新與顯示,并將顯示的天氣可以發(fā)短信給指定的聯(lián)系人。</p><p> 1.1 設(shè)計目的 </p><p> 天氣軟件是一種非常實用的信息服務(wù),隨著智能手機的不
8、斷普及,各種智能手機平臺下都有各種各樣的天氣軟件。Android作為現(xiàn)在主流的智能手機之一,自然也需要這方面的軟件。天氣關(guān)系到人們的日常生活,如告知溫暖,方便出行等。此外,對未來天氣的預(yù)測你還可以指定發(fā)短信給家里不會上網(wǎng)的父母,幫助父母進(jìn)行農(nóng)作物的澆灌、施肥、收割等工作。</p><p><b> 1.2 設(shè)計思路</b></p><p> 天氣短信這個設(shè)計不算復(fù)
9、雜,我先在eclipse里面把系統(tǒng)的主界面寫好,然后先是聯(lián)網(wǎng)解析從360天氣預(yù)報端口讀取來的數(shù)據(jù),數(shù)據(jù)解析完了在本地創(chuàng)建數(shù)據(jù)庫,把聯(lián)網(wǎng)解析的數(shù)據(jù)保存在本地,減少流量的使用。之后就是選擇想要的城市來獲取當(dāng)前城市未來的天氣情況,并把天氣情況編輯成樣例短信,最后選擇聯(lián)系人在指定的時間發(fā)送短信,最后就是短信發(fā)送成功之后會提醒的消息推送通知。</p><p><b> 1.3系統(tǒng)需求分析</b>&l
10、t;/p><p> 本軟件是一個基于Android的應(yīng)用程序,啟動程序后可以進(jìn)行城市的選擇設(shè)置,可以通過文字顯示當(dāng)前和未來的天氣狀況,包括溫度、濕度、風(fēng)向和雨雪情況等。這些天氣數(shù)據(jù)是通過后臺服務(wù)獲取的,這個后臺服務(wù)可以按照一定時間間隔,從360上獲取天氣預(yù)報信息,并將天氣信息保存在數(shù)據(jù)庫中??梢赃x定指定的聯(lián)系人并且設(shè)置指定的時間發(fā)送天氣短信給對方。</p><p> 從上面的描述中可以基本
11、了解軟件的功能需求:</p><p> (1) 啟動Android的應(yīng)用程序;</p><p> (2) 設(shè)置界面:對要顯示天氣預(yù)報的城市進(jìn)行設(shè)置;</p><p> (3) 顯示界面:通過文字顯示當(dāng)前的天氣情況,包括日期、時間、城市、最高溫度、最低溫度、當(dāng)前溫度等。而且可以選定指定的聯(lián)系人在指定的時間發(fā)送天氣短信給對方。</p><p&g
12、t;<b> 1.4開發(fā)環(huán)境</b></p><p> 1.4.1 Android開發(fā)環(huán)境的介紹</p><p> Android平臺使用Java編程語言來開發(fā)應(yīng)用程序,而Android提供了對Java的核心支持??紤]到Java虛擬機的執(zhí)行效率和占用資源情況,Google重新設(shè)計了Java的編譯器,命名為Dalvik。Dalvik是經(jīng)過優(yōu)化的Java編譯器,允許
13、在有限的內(nèi)存中同時運行多個虛擬機的實例,并且每一個Dalvik應(yīng)用作為一個獨立的Linux進(jìn)程執(zhí)行,獨立的進(jìn)程可以防止在虛擬機崩潰的時候所有程序都被關(guān)閉。</p><p> 項目的開發(fā)在Eclipse環(huán)境中進(jìn)行,由于進(jìn)行的是Android應(yīng)用程序的開發(fā),需要在Eclipse安裝ADT插件,即Android開發(fā)工具,這樣Eclipse就可以和Android SDK建立連接,在Eclipse中啟動Android模擬
14、器、調(diào)試程序等工作。</p><p> 由以上分析可知,Android平臺的搭建需要Android SDK、Java SDK、Eclipse和ADT四個軟件。</p><p> 1.4.2 Android的開發(fā)平臺搭建</p><p> 在進(jìn)行Android應(yīng)用程序的開發(fā)前,要先搭建Android平臺,然后才能在開發(fā)環(huán)境中進(jìn)行編程。根據(jù)官方指導(dǎo),對Androi
15、d平臺的搭建過程介紹如下:</p><p> 首先,在官方網(wǎng)址上下載JDK6.0并安裝,網(wǎng)址是http://www.oracle.com/technetwork/java/javase/downloads/index.html,安裝后設(shè)置系統(tǒng)環(huán)境變量JAVA_HOME、CLASS_PATH、PATH的值;</p><p> 然后,在官方網(wǎng)址上下載更新的SDK進(jìn)行安裝,官方網(wǎng)址為http
16、://development.android.com/sdk/index.html,下載完后解壓到指定文件夾,啟動SDK Manager進(jìn)行安裝,選擇需要的Android版本,然后更新,這次更新需要的時間比較慢,所以更新前要做好準(zhǔn)備。安裝完成后,將ADB命令所在的目錄platform-tools的完整路徑添加到系統(tǒng)的環(huán)境變量PATH中,就能夠在命令中使用ADB命令了;</p><p> 接下來要安裝的是ADT插
17、件,即Android開發(fā)工具。因為ADT在線安裝容易遇到問題,增加一些不必要的麻煩所以需要下載后在本地安裝。指定網(wǎng)址為http://development.android.com/sdk/index.html,下載存放在指定的位置以便后面使用;</p><p> 最后,下載Eclipse,建議選擇Eclipse3.4以上版本,網(wǎng)址為http://www.eclipse.org/downloads/,解壓到指定位
18、置后運行。選擇Eclipse菜單中的Help>Install New Software選項卡上的Available Software,點擊右側(cè)的Add,然后在Name框中填寫Android,在Location框中選擇上步下載的ADT文件,然后點擊OK>Finish>Install All,這時關(guān)閉Eclipse再重新啟動。重啟后選擇Eclipse菜單中的Window>Preferences,在左側(cè)的Android
19、項目中SDK Location中填入Android SDK解壓后的目錄,然后點擊Apply。</p><p> 這樣,整個平臺的搭建工作就完成了。</p><p><b> 1.5 運行環(huán)境</b></p><p> 運行需要Android SDK、Java JDK、Eclipse和ADT四個軟件,以及Android2.2的虛擬機或者真機
20、,操作系統(tǒng)為Windows7的PC機一臺</p><p><b> 1.6 參考文獻(xiàn)</b></p><p> [1] 王向輝,張國印,沈潔. Android應(yīng)用程序開發(fā)[M].北京:清華大學(xué)出版社,2012</p><p> [2] 李剛. 瘋狂Android講義[M]. 北京:電子工業(yè)出版社,2013</p><p
21、> [3] 明日科技. Android從入門到精通[M]. 北京:清華大學(xué)出版社,2012</p><p> [4] 李剛. 瘋狂Java講義[M]. 北京:電子工業(yè)出版社,2013</p><p> [5] Y.Daniel Liang. Java語言程序設(shè)計(李娜) [M]. 北京:機械工業(yè)出版社,2011</p><p> [6] 鄧凡平. 深
22、入理解Android[M]. 北京:機械工業(yè)出版社,2011</p><p> [7] 馬超,孫仁貴. Android應(yīng)用開發(fā)全程實錄[M]. 北京:人民郵電出版社,2012</p><p> [8] 劉昌平,范明鈺.Android手機的輕量級訪問控制[J].計算機應(yīng)用研究,2010,7:201-212.</p><p> [9] 張仕成.基于Google A
23、ndroid平臺的應(yīng)用程序開發(fā)與研究[J].電腦知識與技術(shù),2009:35-59.</p><p> [10] 楊豐盛.Android應(yīng)用開發(fā)揭秘[M].北京:機械工業(yè)出版社,2010</p><p><b> 2.總體設(shè)計</b></p><p><b> 2.1系統(tǒng)結(jié)構(gòu)</b></p><p&
24、gt; 2.1.1 系統(tǒng)流程圖</p><p> 本系統(tǒng)的流程是當(dāng)我們在桌面上打開軟件時進(jìn)入到用戶的主界面,進(jìn)入主界面后第一次是會讓我們選擇城市,我們點擊城市的下拉列表選中自己想要查詢的城市,在我們的短信中會出現(xiàn)該城市的天氣并生成樣列短信,最后我們設(shè)置指定的聯(lián)系人并設(shè)置指定的時間發(fā)送短信到指定的聯(lián)系人,當(dāng)短信發(fā)送成功后我們會收到來自通知欄的消息告訴我們短信已經(jīng)發(fā)送成功。</p><p>
25、;<b> 圖2-1系統(tǒng)流程圖</b></p><p> 2.1.2 模塊結(jié)構(gòu)圖</p><p> App啟動服務(wù) </p><p><b> 設(shè)置相關(guān)信息</b></p><p><b&
26、gt; 天氣信息</b></p><p> startService(new Intent)</p><p><b> 啟動服務(wù)</b></p><p><b> 圖2-2模塊結(jié)構(gòu)圖</b></p><p><b> 2.2數(shù)據(jù)庫的設(shè)計</b></p
27、><p> 由于在本系統(tǒng)中是通過中央氣象臺的WebService 提供的API訪問得到的天氣預(yù)報,在查詢指定城市的天氣時,需要用到它提供的城市碼,而城市碼相對穩(wěn)定不變,所以在構(gòu)建系統(tǒng)時將其事先通過Android的網(wǎng)絡(luò)訪問技術(shù)將其緩沖到本地SQLite數(shù)據(jù)庫進(jìn)行保存起來,方便以后的查詢,同時節(jié)省了流量開銷。綜上所述在本地建立db_weather.db的數(shù)據(jù)庫,其中的表結(jié)構(gòu)如下:</p><p>
28、; 圖2-3數(shù)據(jù)庫表結(jié)構(gòu)</p><p> 其中只存在兩個表: provices 和citys </p><p> City 中存在city_num用天氣的查詢,同時還存在外鍵province_id與provices表形成1對n的關(guān)系。</p><p> 2.3 模塊功能設(shè)計</p><p> 2.3.1 獲取當(dāng)前天氣功能</
29、p><p> 顯示指定城市三天內(nèi)的天氣狀況,包括日期、城市名稱、溫度、風(fēng)力,用戶可通過選擇城市來獲取城市天氣,并且可以把天氣編輯成短信。</p><p> 2.3.2 選擇城市的功能</p><p> 通過手動選擇可伸展性下拉列表單擊選擇系統(tǒng)數(shù)據(jù)庫中預(yù)存的城市來進(jìn)行設(shè)置,同時為了方便用戶查找,當(dāng)單擊選中城市時跳轉(zhuǎn)至天氣顯示界面,來顯示該城市當(dāng)三天內(nèi)的天氣狀況。&l
30、t;/p><p> 2.3.3 發(fā)送短信的功能</p><p> 為了使用戶能夠選擇指定的聯(lián)系人,在界面上加上了選擇聯(lián)系人的輸入框,并且還有時間選擇,是用戶能夠設(shè)置在指定的時間發(fā)送短信給指定的人。</p><p><b> 3.運行設(shè)計</b></p><p><b> 3.1用戶界面設(shè)計</b>
31、;</p><p> 根據(jù)需求分析可以知道,應(yīng)用程序應(yīng)包含三個主要的功能,這里需要進(jìn)一步分析每個功能中應(yīng)該具體怎樣實現(xiàn)。</p><p> 在獲取網(wǎng)絡(luò)上的天氣服務(wù)時應(yīng)該做到讀取未來三天的天氣,并把天氣轉(zhuǎn)為短信內(nèi)容示例。當(dāng)然我們可以選擇當(dāng)前城市的信息,設(shè)置省市聯(lián)動的效果,并且我們可以設(shè)置指定聯(lián)系人的信息和在什么時間發(fā)送短信。</p><p> 根據(jù)以上的功能分析
32、得到以下的用戶界面圖:</p><p><b> 圖3-1主界面布局</b></p><p><b> 圖3-2用戶主界面</b></p><p><b> 圖3-3選擇省份</b></p><p><b> 圖3-4選擇城市</b></p&
33、gt;<p><b> 3.2 運行代碼</b></p><p> 根據(jù)天氣預(yù)報系統(tǒng)功能需求分析,系統(tǒng)啟動后,應(yīng)在主界面上呈現(xiàn)出,默認(rèn)城市的天氣數(shù)據(jù),因此需要創(chuàng)建主界面和解析天氣的類,包括獲取、解析城市天氣數(shù)據(jù),并在用戶界面上呈現(xiàn)出來。為此,需要解決的問題是手機終端從Web 服務(wù)器獲取了所有類型的數(shù)據(jù)之后,將這些數(shù)據(jù)進(jìn)一步交給Android 手機終端Vi
34、ew 組件,在手機界面上顯示給用戶。聯(lián)網(wǎng)獲取天氣情況并把天氣情況變?yōu)闃永绦拧V饕峭ㄟ^360天氣預(yù)報的端口從網(wǎng)絡(luò)上解析數(shù)據(jù),并把數(shù)據(jù)保存到本地的數(shù)據(jù)庫中,在從數(shù)據(jù)庫中調(diào)取所需城市的天氣,并把天氣轉(zhuǎn)為示例代碼:</p><p> //重寫callable接口中的方法call</p><p> @SuppressLint("SimpleDateFormat"
35、) @Override</p><p> public String call() throws Exception {</p><p><b> try {</b></p><p> //這里使用的是360天氣預(yù)報,比較幾個之后,發(fā)現(xiàn)這個比較靠譜</p><p> //url最后的101010100 是指北京,
36、在http://cdn.weather.hao.#/頁面選擇想要的城市,url中即可獲取城市編碼101110908</p><p> //聯(lián)網(wǎng)讀取天氣數(shù)據(jù)</p><p> //創(chuàng)建連網(wǎng)使用的客戶端連接類httpclient,以及本次請求的封裝對象httpget</p><p> HttpGet httpGet = new HttpGet(&q
37、uot;http://cdn.weather.hao.#/api_weather_info.php?app=hao360&_jsonp=smartloaddata101010100&code="+code);</p><p> HttpClient httpClient = new DefaultHttpClient();</p><p> //執(zhí)行
38、請求并獲取服務(wù)器的響應(yīng)</p><p> HttpResponse httpResponse = httpClient.execute(httpGet);</p><p> //獲取http的響應(yīng)碼,判斷本次連接是否成功</p><p> if (httpResponse.getStatusLine().getStatusCode() == HttpStatu
39、s.SC_OK) {</p><p> //獲取響應(yīng)數(shù)據(jù)的字符串內(nèi)容并針對字符串進(jìn)行拆分</p><p> String unicodeResult = EntityUtils.toString(</p><p> httpResponse.getEntity()).split("\\(")[1]</p><p>
40、 .split("\\)")[0];</p><p> // unicode解碼后獲取各節(jié)點的值</p><p><b> // 獲取市</b></p><p> //System.out.println(unescapeUnicode(unicodeResult));</p><p> ti
41、mestamp=(new JSONObject(unicodeResult).getLong("time"));</p><p> //System.out.println(timestamp);</p><p> //通過stringbuffer實現(xiàn)字符串的拼接</p><p> weatherMsg.append(</p>
42、<p> new JSONObject(unicodeResult).getJSONArray("area")</p><p> .getString(2).split("\"")[1]).append(";");</p><p> JSONArray jsonArray = new JSONObjec
43、t(unicodeResult)</p><p> .getJSONArray("weather");</p><p> for (int i = 0; i < jsonArray.length(); i++) {</p><p> JSONObject jsonDay = jsonArray.getJSONObject(i);<
44、;/p><p> // 獲取日期 幾月幾日</p><p> weatherMsg.append(sdf2.format(sdf.parse(jsonDay</p><p> .getString("date"))));</p><p> JSONObject jsonInfo = jsonDay.getJSONObj
45、ect("info");</p><p> String[] dayInfo = jsonInfo.getString("day")</p><p> .split("\"");</p><p> String[] nightInfo = jsonInfo.getString("n
46、ight").split(</p><p><b> "\"");</b></p><p> if (dayInfo[3].equals(nightInfo[3])) {</p><p> weatherMsg.append(dayInfo[3]).append("#");<
47、;/p><p><b> } else {</b></p><p> weatherMsg.append(dayInfo[3]).append("轉(zhuǎn)")</p><p> .append(nightInfo[3]).append("#");</p><p><b>
48、}</b></p><p> if (!(dayInfo[9].equals("微風(fēng)"))) {</p><p> if (dayInfo[7].equals(nightInfo[7])) {</p><p> weatherMsg.append(dayInfo[7]);</p><p> if (da
49、yInfo[9].equals(nightInfo[9])) {</p><p> weatherMsg.append(dayInfo[9]).append("#");</p><p><b> } else {</b></p><p> weatherMsg.append("白天").append
50、(dayInfo[9]);</p><p> weatherMsg.append("夜間")</p><p> .append(nightInfo[9]).append("#");</p><p><b> }</b></p><p><b> } else {&
51、lt;/b></p><p> weatherMsg.append("白天").append(dayInfo[7])</p><p> .append(dayInfo[9]).append("#");</p><p> if (!(nightInfo[9].equals("微風(fēng)"))) {<
52、;/p><p> weatherMsg.append("夜間")</p><p> .append(nightInfo[7])</p><p> .append(nightInfo[9]).append("#");</p><p><b> }</b></p>&
53、lt;p><b> }</b></p><p> } else if (!(nightInfo[9].equals("微風(fēng)"))) {</p><p> weatherMsg.append("夜間").append(nightInfo[7])</p><p> .append(nightIn
54、fo[9]).append("#");</p><p><b> }</b></p><p> weatherMsg.append(nightInfo[5]).append("~")</p><p> .append(dayInfo[5]).append("度;");</p
55、><p><b> }</b></p><p> weather = weatherMsg.substring(0, weatherMsg.length() - 1);</p><p> weathers = weather.split(";");</p><p> //將weathers數(shù)組轉(zhuǎn)成
56、集合后,toString再轉(zhuǎn)成字符串</p><p> weather = Arrays.asList(weathers).toString(); // 4 day</p><p> for(int i=0;weather.length()>70;i++)</p><p><b> {</b></p><p>
57、; System.out.println(weather.length());</p><p> //將數(shù)據(jù)轉(zhuǎn)成集合,然后通過sublist方法截取集合中的部分內(nèi)容后,將截取后的集合toString的到字符串</p><p> weather = Arrays.asList(weathers).subList(0, Arrays.asList(weathers).size()-i).
58、toString();</p><p><b> }</b></p><p> //針對字符串進(jìn)行字符的替換</p><p> weather = weather.replace("[", "").replace("]", "").replace("
59、 ", "").replace(",", ";").replace("#", ",");</p><p> //String date = new java.text.SimpleDateFormat("HH:mm").format(new java.util.Date(timest
60、amp * 1000));</p><p> //weather = weather + ";" + date + "發(fā)布";</p><p> return weather;</p><p><b> }</b></p><p> } catch (Exception e
61、) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p> return null;</p><p><b> }</b></p><p> public String unescapeUnicod
62、e(String str){</p><p> StringBuffer sb=new StringBuffer();</p><p> //將字符串根據(jù)制定的正則表達(dá)式進(jìn)行匹配(可簡單的理解為將特殊的字符串根據(jù)指定的方式進(jìn)行拼配后替換)</p><p> Matcher matcher = Pattern.compile("\\\\u([0-9a-
63、fA-F]{4})").matcher(str);</p><p> while(matcher.find()){ //如果字符串中包含指定字符</p><p> //則對字符串進(jìn)行退換操作</p><p> matcher.appendReplacement(sb, (char)Integer.parseInt(matcher.group(1),
64、16)+""); </p><p><b> }</b></p><p> matcher.appendTail(sb);</p><p> return sb.toString().replace("\\", "");//順便去掉上面的轉(zhuǎn)義字符"\\"&l
65、t;/p><p><b> }</b></p><p> 根據(jù)天去短信系統(tǒng)的需求分析,選擇城市并獲取天氣的類,通過連接本地的SQLite數(shù)據(jù)庫根據(jù)城市的城市碼來到本地的數(shù)據(jù)庫中找到并把天氣顯示在用戶的界面上,具體實現(xiàn)代碼如下:</p><p> public void initSpinner1(){</p><p>
66、 dbm = new DBManager(this);</p><p> dbm.openDatabase();</p><p> db = dbm.getDatabase();//獲取數(shù)據(jù)庫對象</p><p> List<MyListItem> list = new ArrayList<MyListItem>();</p>
67、;<p><b> try { </b></p><p> String sql = "select * from provinces"; </p><p> //查詢數(shù)據(jù)庫中的provinces表中的數(shù)據(jù)</p><p> Cursor cursor = db.rawQuery(sql,nul
68、l); </p><p> cursor.moveToFirst();</p><p> //如果有多行數(shù)據(jù),就循環(huán)讀取表中每一行的數(shù)據(jù)</p><p> while (!cursor.isLast()){ </p><p> //獲取表中列名為_id的列中當(dāng)前行的值</p><p> String cod
69、e=cursor.getString(cursor.getColumnIndex("_id"));</p><p> System.out.println("initSpinner1"+code);</p><p> //獲取表中第二列中當(dāng)前行的數(shù)據(jù)值</p><p> byte bytes[]=cursor.getBl
70、ob(1); </p><p> String name=new String(bytes,"utf-8");</p><p> //初始化列表中每個item中要顯示的數(shù)據(jù)封裝類對象</p><p> MyListItem myListItem=new MyListItem();</p><p> myListIt
71、em.setName(name);</p><p> myListItem.setPcode(code);</p><p> list.add(myListItem);</p><p> //讓游標(biāo)移動到下一行</p><p> cursor.moveToNext();</p><p><b> }
72、</b></p><p> //如果沒有多行數(shù)據(jù),那么就讀取當(dāng)前行的數(shù)據(jù)</p><p> String code=cursor.getString(cursor.getColumnIndex("_id")); </p><p> byte bytes[]=cursor.getBlob(1); </p><p
73、> String name=new String(bytes,"utf-8");</p><p> MyListItem myListItem=new MyListItem();</p><p> myListItem.setName(name);</p><p> myListItem.setPcode(code);</p&
74、gt;<p> list.add(myListItem); </p><p> } catch (Exception e) { </p><p><b> } </b></p><p> MyAdapter myAdapter = new MyAdapter(this,list);</p><p>
75、; spinner1.setAdapter(myAdapter);</p><p> String sql = "select province_id from citys where city_num='"+areaCode+"'";</p><p> //查詢數(shù)據(jù)庫中指定城市的province_id</p>&
76、lt;p> Cursor cursor = db.rawQuery(sql,null);</p><p> cursor.moveToFirst();//將游標(biāo)移動到表中第一行</p><p> spinner1.setSelection(cursor.getInt(0), true);//設(shè)置spinner默認(rèn)選項</p><p> //設(shè)置spin
77、ner的選擇事件</p><p> spinner1.setOnItemSelectedListener(new SpinnerOnSelectedListener1());</p><p><b> //關(guān)閉數(shù)據(jù)庫</b></p><p> dbm.closeDatabase();</p><p> db.cl
78、ose();</p><p> String pcode = String.valueOf(cursor.getInt(0)+1);</p><p> initSpinner2(pcode);</p><p><b> }</b></p><p> public void initSpinner2(String
79、 pcode){</p><p> dbm = new DBManager(this);</p><p> dbm.openDatabase();</p><p> db = dbm.getDatabase();</p><p> List<MyListItem> list = new ArrayList<MyLis
80、tItem>();</p><p> String dstName="";</p><p> int idx=0;</p><p> int found=0;</p><p><b> {</b></p><p> String sql = "sele
81、ct name from citys where city_num='"+areaCode+"'";</p><p> //查詢指定城市的城市名</p><p> Cursor cursor = db.rawQuery(sql,null);</p><p> cursor.moveToFirst();</p&
82、gt;<p> byte bytes[]=cursor.getBlob(0);</p><p><b> try {</b></p><p> dstName = new String(bytes,"utf-8");</p><p> } catch (UnsupportedEncodingExcept
83、ion e) {</p><p> // TODO Auto-generated catch block</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p> pco
84、de = String.valueOf(Integer.valueOf(pcode).intValue() - 1);</p><p><b> try {</b></p><p> String sql = "select * from citys where province_id='"+pcode+"'"
85、;; </p><p> //查詢表中指定省份所有城市的城市信息</p><p> Cursor cursor = db.rawQuery(sql,null); </p><p> cursor.moveToFirst();</p><p> while (!cursor.isLast()){ </p><p&
86、gt; String code=cursor.getString(cursor.getColumnIndex("_id")); </p><p> byte bytes[]=cursor.getBlob(2); </p><p> String name=new String(bytes,"utf-8");</p><p&g
87、t; String city_num = cursor.getString(cursor.getColumnIndex("city_num"));</p><p> if(0==found)</p><p><b> {</b></p><p> if(!dstName.equals(name))</p>
88、<p><b> {</b></p><p><b> idx += 1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b><
89、/p><p><b> found=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> MyListItem myListItem=new MyListItem();</p><p> myL
90、istItem.setName(name);</p><p> myListItem.setPcode(code);</p><p> myListItem.setCityNum(city_num);</p><p> list.add(myListItem);</p><p> cursor.moveToNext();</p&
91、gt;<p><b> }</b></p><p> String code=cursor.getString(cursor.getColumnIndex("_id")); </p><p> byte bytes[]=cursor.getBlob(2); </p><p> String name=n
92、ew String(bytes,"utf-8");</p><p> String city_num = cursor.getString(cursor.getColumnIndex("city_num"));</p><p> MyListItem myListItem=new MyListItem();</p><p>
93、; myListItem.setName(name);</p><p> myListItem.setPcode(code);</p><p> myListItem.setCityNum(city_num);</p><p> list.add(myListItem);</p><p> } catch (Exception e)
94、 { </p><p><b> } </b></p><p> MyAdapter myAdapter = new MyAdapter(this,list);</p><p> spinner2.setAdapter(myAdapter);</p><p> spinner2.setSelection(idx
95、, true);</p><p> spinner2.setOnItemSelectedListener(new SpinnerOnSelectedListener2());</p><p> dbm.closeDatabase();</p><p> db.close();</p><p><b> }</b>
96、;</p><p> class SpinnerOnSelectedListener1 implements OnItemSelectedListener{</p><p> public void onItemSelected(AdapterView<?> adapterView, View view, int position,</p><p>
97、 long id) {</p><p> //獲取spinner選擇的item選項</p><p> String pcode =((MyListItem) adapterView.getItemAtPosition(position)).getPcode();</p><p> initSpinner2(pcode);</p><p&g
98、t;<b> }</b></p><p> public void onNothingSelected(AdapterView<?> adapterView) {</p><p> // TODO Auto-generated method stub</p><p><b> }</b></p
99、><p><b> }</b></p><p> class SpinnerOnSelectedListener2 implements OnItemSelectedListener{</p><p> public void onItemSelected(AdapterView<?> adapterView, View view
100、, int position,</p><p> long id) {</p><p> String city_num =((MyListItem) adapterView.getItemAtPosition(position)).getCityNum();</p><p> areaCode = city_num;</p><p>
101、<b> }</b></p><p> public void onNothingSelected(AdapterView<?> adapterView) {</p><p> // TODO Auto-generated method stub</p><p><b> }</b></p&g
102、t;<p><b> }</b></p><p> //設(shè)置點擊菜單鍵時的顯示內(nèi)容</p><p><b> @Override</b></p><p> public boolean onCreateOptionsMenu(Menu menu) {</p><p> //
103、Inflate the menu; this adds items to the action bar if it is present.</p><p> getMenuInflater().inflate(R.menu.main, menu);</p><p> return true;</p><p><b> }</b></
104、p><p> //設(shè)置菜單選項選中時的事件監(jiān)聽</p><p><b> @Override</b></p><p> public boolean onOptionsItemSelected(MenuItem item) {</p><p> // Handle action bar item clicks her
105、e. The action bar will</p><p> // automatically handle clicks on the Home/Up button, so long</p><p> // as you specify a parent activity in AndroidManifest.xml.</p><p> int id =
106、item.getItemId();</p><p> if (id == R.id.action_settings) {</p><p> String info="作者:丁柏林\nE-MAIL:1183084407@qq.com";</p><p> new AlertDialog.Builder(MainActivity.this).s
107、etTitle("關(guān)于").setMessage(info).setPositiveButton("確定", null).show();</p><p> return true;</p><p><b> }</b></p><p> return super.onOptionsItemSelec
108、ted(item);</p><p><b> }</b></p><p> 獲取天氣后生成短信,以下代碼實現(xiàn)了怎樣發(fā)送短信的功能:</p><p> public class SendSms {</p><p><b> /*</b></p><p> * 以下代
109、碼均為實現(xiàn)發(fā)送短信的代碼</p><p><b> * */</b></p><p> SmsManager smsManager = SmsManager.getDefault();</p><p> public boolean sendMessage(String phoneCode, String content,PendingI
110、ntent sentIntent) {</p><p> if (content.length() > 70) {</p><p> List<String> weatherList = smsManager.divideMessage(content);</p><p> for (String str : weatherList) {&l
111、t;/p><p> smsManager.sendTextMessage(phoneCode, null, str, sentIntent,</p><p><b> null);</b></p><p><b> }</b></p><p><b> } else {</b&g
112、t;</p><p> smsManager.sendTextMessage(phoneCode, null, content, sentIntent,</p><p><b> null);</b></p><p><b> }</b></p><p> return false;<
113、/p><p><b> }</b></p><p><b> }</b></p><p> 存儲和讀取文件的類:</p><p> public class DataFile {</p><p> private Context context;</p>
114、<p> final private String FILE_NAME="weather.dat";</p><p> public DataFile(Context context) {</p><p> this.context = context;</p><p><b> }</b></p&g
115、t;<p><b> //存儲數(shù)據(jù)到文件</b></p><p> public void saveData(String data) throws Exception{</p><p> //context.getFilesDir();// 得到存放文件的系統(tǒng)目錄 /data/data/<package name>/files<
116、/p><p> //context.getCacheDir(); //緩存目錄 /data/data/<package name>/cache</p><p> /*獲取文件輸出流,方便將數(shù)據(jù)寫入指定文件中*/</p><p> FileOutputStream outputStream=context.openFileOutput(FILE_NAM
117、E, Context.MODE_PRIVATE);</p><p><b> //寫入數(shù)據(jù)</b></p><p> outputStream.write(data.getBytes());</p><p><b> //關(guān)閉流</b></p><p> outputStream.close
118、();</p><p><b> }</b></p><p><b> // 讀取數(shù)據(jù)</b></p><p> public String getData() throws Exception{</p><p> //獲取指定文件的輸入流,文件存儲位置:/data/data/<pac
119、kage name>/files/FILE_NAME</p><p> FileInputStream inputStream=context.openFileInput(FILE_NAME);</p><p> //得到緩存輸出流對象</p><p> ByteArrayOutputStream outStream=new ByteArrayOutpu
120、tStream();</p><p> byte[] buffer=new byte[1024];</p><p> int len=0;</p><p> while ((len=inputStream.read(buffer))!=-1){</p><p> //將讀取的內(nèi)容寫入緩存輸出流中</p><p>
121、; outStream.write(buffer, 0, len);</p><p><b> }</b></p><p> outStream.close();</p><p> //得到輸出流中的數(shù)據(jù)byte數(shù)組</p><p> byte[] data=outStream.toByteArray();&l
122、t;/p><p> //講數(shù)組轉(zhuǎn)成字符串并返回</p><p> String name=new String(data);</p><p> return name;</p><p><b> }</b></p><p><b> }</b></p>&
123、lt;p><b> 數(shù)據(jù)庫的管理類:</b></p><p> public class DBManager {</p><p> private final int BUFFER_SIZE = 1024;</p><p> public static final String DB_NAME = "city_cn.s3
124、db";</p><p> public static final String PACKAGE_NAME = "com.example.weathertest";</p><p> //定義數(shù)據(jù)庫文件存儲路徑:data/data/程序包名</p><p> public static final String DB_PATH =
125、 "/data"</p><p> + Environment.getDataDirectory().getAbsolutePath() + "/"+ PACKAGE_NAME;</p><p> private SQLiteDatabase database; //定義數(shù)據(jù)庫對象</p><p> private C
126、ontext context;</p><p> private File file=null;</p><p> DBManager(Context context) {</p><p> Log.e("cc", "DBManager");</p><p> this.context = co
127、ntext;</p><p><b> }</b></p><p> public void openDatabase() {</p><p> Log.e("cc", "openDatabase()"+DB_PATH + "/" + DB_NAME);</p>&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于android的天氣預(yù)報查詢系統(tǒng)的實現(xiàn)畢業(yè)設(shè)計
- 基于android的天氣預(yù)報查詢系統(tǒng)的實現(xiàn)--畢業(yè)設(shè)計
- 基于android手機天氣預(yù)報系統(tǒng)
- 基于android系統(tǒng)的天氣預(yù)報查詢系統(tǒng)
- 基于android手機移動天氣預(yù)報系統(tǒng)
- 基于android的天氣預(yù)報查詢系統(tǒng)的實現(xiàn)
- 基于android天氣預(yù)報課程設(shè)計
- 基于Android手機的天氣預(yù)報查詢系統(tǒng).pdf
- 基于Android的天氣預(yù)報系統(tǒng)的設(shè)計與實現(xiàn).pdf
- 手機天氣預(yù)報系統(tǒng)畢業(yè)設(shè)計.pdf
- 手機天氣預(yù)報系統(tǒng)畢業(yè)設(shè)計.pdf
- 基于ios的天氣預(yù)報查詢系統(tǒng)設(shè)計與實現(xiàn)說明書畢業(yè)論文
- 基于android的天氣預(yù)報軟件的設(shè)計與實現(xiàn)
- 基于android平臺的天氣預(yù)報系統(tǒng)的設(shè)計與開發(fā)畢業(yè)論文
- 淺析基于android的天氣預(yù)報系統(tǒng)設(shè)計與實現(xiàn)(論文原稿)
- 畢業(yè)論文——手機天氣預(yù)報系統(tǒng)畢業(yè)設(shè)計
- 畢業(yè)論文——手機天氣預(yù)報系統(tǒng)畢業(yè)設(shè)計
- 基于android系統(tǒng)天氣預(yù)報應(yīng)用程序畢業(yè)論文
- 軟件工程畢業(yè)論文-基于android系統(tǒng)的天氣預(yù)報查詢系統(tǒng)的設(shè)計與實現(xiàn)
- android平臺天氣預(yù)報widget的設(shè)計與實現(xiàn)畢業(yè)論文
評論
0/150
提交評論