




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、WORD34/35目錄TOC o 1-3 h z uHYPERLINK l _Toc3438019181.需求分析 PAGEREF _Toc343801918 h 1HYPERLINK l _Toc3438019191.1 功能需求 PAGEREF _Toc343801919 h 1HYPERLINK l _Toc3438019201.2 界面需求 PAGEREF _Toc343801920 h 1HYPERLINK l _Toc3438019211.3 部功能 PAGEREF _Toc343801921 h 1HYPERLINK l _Toc3438019222.程序設(shè)計 PAGEREF _
2、Toc343801922 h 2HYPERLINK l _Toc3438019232.1 用戶界面設(shè)計 PAGEREF _Toc343801923 h 2HYPERLINK l _Toc3438019242.2 數(shù)據(jù)庫設(shè)計 PAGEREF _Toc343801924 h 2HYPERLINK l _Toc3438019252.2.1配置信息 PAGEREF _Toc343801925 h 2HYPERLINK l _Toc3438019262.2.2 SMS短信服務信息 PAGEREF _Toc343801926 h 3HYPERLINK l _Toc3438019272.3 程序模塊設(shè)計 P
3、AGEREF _Toc343801927 h 3HYPERLINK l _Toc3438019283.程序開發(fā) PAGEREF _Toc343801928 h 4HYPERLINK l _Toc3438019293.1 文件結(jié)構(gòu)與用途 PAGEREF _Toc343801929 h 4HYPERLINK l _Toc3438019303.2 數(shù)據(jù)庫適配器 PAGEREF _Toc343801930 h 5HYPERLINK l _Toc3438019313.3 短信監(jiān)聽器 PAGEREF _Toc343801931 h 8HYPERLINK l _Toc3438019323.4 后臺服務 PA
4、GEREF _Toc343801932 h 10HYPERLINK l _Toc3438019333.4.1短信發(fā)送模塊 PAGEREF _Toc343801933 h 11HYPERLINK l _Toc3438019343.4.2數(shù)據(jù)庫獲取模塊 PAGEREF _Toc343801934 h 13HYPERLINK l _Toc3438019353.5 用戶界面 PAGEREF _Toc343801935 h 17HYPERLINK l _Toc3438019363.5.1 WeatherActivity PAGEREF _Toc343801936 h 18HYPERLINK l _Toc
5、3438019373.5.2 HistoryActivity PAGEREF _Toc343801937 h 19HYPERLINK l _Toc3438019383.5.3 SetupActivity PAGEREF _Toc343801938 h 24HYPERLINK l _Toc3438019393.5.4 GoogleMapActivity PAGEREF _Toc343801939 h 25HYPERLINK l _Toc3438019404.總結(jié) PAGEREF _Toc343801940 h 34HYPERLINK l _Toc3438019415.參考文獻 PAGEREF _
6、Toc343801941 h 35天氣預報短信服務系統(tǒng)需求分析1.1 功能需求天氣預報短信服務系統(tǒng)中,有一個顯示天氣情況的用戶界面,可以通過圖片和文字顯示當前和未來幾天的天氣狀況,包括溫度、濕度、風向和雨雪情況等。這些天氣數(shù)據(jù)是通過后臺服務獲取的,這個后臺服務可以按照一定時間間隔,從Yahoo上獲取天氣預報信息,并將天氣信息保存在后臺服務中。系統(tǒng)還需要提供基于SMS短信的天氣數(shù)據(jù)服務,其他手機用戶可以向本示例所在的手機上發(fā)送SMS短信,并在短信中包含用戶指定的關(guān)鍵字,則可以將保存在后臺服務中的天氣情況,再通過SMS短信回復給用戶。最后,每個被發(fā)送的SMS短信都要被記錄下來,用戶可以瀏覽或刪除這
7、些回復信息。本系統(tǒng)還要顯示地圖,在地圖上顯示某地方的天氣信息。1.2 界面需求本示例包含三個主要的用戶界面:(1)顯示天氣預報的用戶界面;(2)顯示已發(fā)送SMS短信的用戶界面;(3)瀏覽和設(shè)置配置信息的用戶界面;(4)Google地圖,在地圖上覆蓋天氣信息。1.3 部功能隱藏在用戶界面后面的部功能,是用戶界面能夠正確實現(xiàn)的基礎(chǔ),如下所述:(1)顯示天氣預報的用戶界面;(2)獲取Yahoo的天氣數(shù)據(jù);(3)顯示SMS短信的用戶界面;(4)根據(jù)關(guān)鍵字監(jiān)視SMS短信;(5)發(fā)送包含天氣信息的SMS短信;(6)將發(fā)送的SMS短信寫入數(shù)據(jù)庫;(7)瀏覽和設(shè)置配置信息的用戶界面;(8)將用戶設(shè)置的配置信息
8、保存到數(shù)據(jù)庫;(9)啟動時讀取數(shù)據(jù)庫中的配置信息;(10)恢復缺省設(shè)置;(11)顯示Google地圖且覆蓋天氣信息的用戶界面,寫入獲取的谷歌密鑰。程序設(shè)計2.1 用戶界面設(shè)計詳細分析應用程序中四個主要用戶界面包含的顯示容,如下所述:(1)在“顯示天氣預報的用戶界面”中,根據(jù)Yahoo可以提供的數(shù)據(jù),在界面上可以顯示當前的天氣狀況,包括城市名稱、溫度、雨雪情況和獲取數(shù)據(jù)時間等信息;還可以顯示未來一天的天氣狀況,僅包括溫度和雨雪情況;(2)在“顯示已發(fā)送SMS短信的用戶界面”中,應顯示每個回復短信的時間、目標手機、城市名稱、當天的天氣狀況和未來一天的天氣狀況;(3)在“瀏覽和設(shè)置配置信息的用戶界面
9、”中,應顯示獲取天氣預報的目標城市名稱、獲取數(shù)據(jù)的頻率和短信的關(guān)鍵字,并允許用戶設(shè)置是否提供短信服務以與是否記錄回復的短信信息;(4)在“顯示谷歌地圖與在地圖上覆蓋天氣信息界面”中,應顯示Google地圖,當用戶點擊地圖上某城市時,會顯示某城市信息與天氣情況。2.2 數(shù)據(jù)庫設(shè)計本系統(tǒng)主要存儲兩種數(shù)據(jù),詳述如下:(1)配置信息:因為配置信息的數(shù)據(jù)量很小,從Android支持的存儲方式上分析,可以保存在SharePreference、文件或SQLite數(shù)據(jù)庫中;(2)SMS短信服務信息:SMS短信服務信息是一個隨著時間推移而不斷增加的數(shù)據(jù),屬于文本信息,且有固定的格式,因此適合使用SQLite數(shù)據(jù)
10、庫進行存儲。綜合分析這兩種需要存儲的數(shù)據(jù),選擇SQLite數(shù)據(jù)庫作為存儲數(shù)據(jù)的方法2.2.1配置信息配置信息中主要保存天氣信息查詢的城市名稱,訪問Yahoo更新天氣信息的頻率,請求天氣信息SMS短信的關(guān)鍵字,且是否提供短信服務和是否記錄短信服務容,其數(shù)據(jù)庫表如下:表2_1 配置信息的數(shù)據(jù)庫屬性數(shù)據(jù)類型說明_idinteger自動增加的主鍵city_nametext進行天氣信息查詢的城市名refresh_speedtext進行天氣信息查詢的頻率,單位為秒/次sms_servicetext是否提供短信服務,即接收到請求短信后是否回復包含天氣信息的短信sms_infotext是否記錄發(fā)出的SMS短信
11、的信息key_wordtext短信服務的關(guān)鍵字,用以確定哪條是請求天氣服務的短信2.2.2 SMS短信服務信息SMS短信服務信息主要保存請求服務短信的發(fā)送者、短信容、接收時間和回復信息的容,其數(shù)據(jù)庫表如下:表2_2 SMS短信服務信息的數(shù)據(jù)庫屬性數(shù)據(jù)類型說明_idinteger自動增加的主鍵sms_sendertext請求服務短信的發(fā)送者sms_bodytext請求服務短信的容信息sms_receive_timetext接收到請求服務短信的時間return_resulttext回復短信的容2.3 程序模塊設(shè)計從功能需求上分析,可以將整個應用程序劃分為4個模塊,分別是用戶界面、后臺服務、數(shù)據(jù)庫適
12、配器和短信監(jiān)聽器。1.由模塊結(jié)構(gòu)圖中可知,后臺服務是整個應用程序的核心,主要包含兩個子模塊,一個是“數(shù)據(jù)獲取模塊”,負責周期性的從Yahoo獲取天氣信息;另一個是“短信服務模塊”,負責處理接收到的服務請求短信,并發(fā)送包含天氣信息的短信2.后臺服務由用戶界面通過Intent啟動,啟動后的后臺服務可以在用戶界面關(guān)閉后仍然保持運行狀態(tài),直到用戶通過用戶界面發(fā)送Intent停止服務,或系統(tǒng)因資源不足而強行關(guān)閉服務3.用戶界面從后臺服務獲取天氣信息,而沒有直接通過網(wǎng)絡(luò)訪問Google的天氣數(shù)據(jù)(1)一方面是因為后臺服務使用了工作線程,通過后臺服務獲取天氣數(shù)據(jù)可以避免因網(wǎng)絡(luò)通信不暢造成界面失去響應(2)另
13、一方面,在用戶關(guān)閉界面后,后臺服務仍然需要更新天氣信息,以保證短信服務數(shù)據(jù)的準確性。用戶界面還會調(diào)用數(shù)據(jù)庫適配器,向SQLite數(shù)據(jù)庫中寫入、讀取配置信息,或?qū)MS短信服務信息進行操作4.短信監(jiān)聽器是一個BroadcastReceiver,監(jiān)視所有接收到的短信(1)如果短信中包含用戶自定義的關(guān)鍵字,短信監(jiān)聽器則會認為這條短信是天氣服務請求短信,將短信的相關(guān)信息寫入后臺服務的短信服務隊列(2)如果用戶在配置信息中選擇無需提供短信服務,短信監(jiān)聽器仍然繼續(xù)監(jiān)聽所有短信,只是后臺服務不再允許將服務請求短信寫入服務隊列5.數(shù)據(jù)庫適配器封裝了所有對SQLite數(shù)據(jù)庫操作的方法,用戶界面和后臺服務會調(diào)用它
14、實現(xiàn)數(shù)據(jù)庫操作。程序開發(fā)3.1 文件結(jié)構(gòu)與用途在程序開發(fā)階段,首先確定“天氣預報短信服務系統(tǒng)”的工程名稱為MyWeather,包名稱為edu.hrbeu.WeatherDemo,據(jù)程序模塊設(shè)計的容,建立WeatherDemo。為了使源代碼文件的結(jié)構(gòu)更加清晰,WeatherDemo設(shè)置了多個命名空間,分別用來保存用戶界面、數(shù)據(jù)庫、后臺服務、SMS短信和天氣數(shù)據(jù)的源代碼文件,命名空間的名稱以與說明參考表3_1。表3_1WeatherDemo的命名空間命名空間說明edu.hrbeu.WeatherDemo存放與用戶界面相關(guān)的源代碼文件edu.hrbeu.WeatherDemo.DB存放與SQLite
15、數(shù)據(jù)庫相關(guān)的源代碼文件edu.hrbeu.WeatherDemo.Service存放與后臺服務相關(guān)的源代碼文件edu.hrbeu.WeatherDemo.SMS 存放與SMS短信相關(guān)的源代碼文件WeatherDemo示例將不同用途的源代碼文件放置在不同的命名空間中,源代碼文件的名稱和用途可以參考表3_2。表3_2WeatherDemo的文件用途說明包名稱文件名說明.WeatherDemoHistoryActivity.java“歷史數(shù)據(jù)”頁的Activity SetupActivity.java“系統(tǒng)設(shè)置”頁的Activity WeatherActivity.java“天氣預報”頁的Activ
16、ity GoogleMapActivity.java“谷歌地圖”頁的ActivityTextOverlay.java地圖覆蓋天氣信息的類WeatherDemo.java程序啟動缺省的Activity .WeatherDemo.DBConfig.java保存配置信息的類DBAdapter.java數(shù)據(jù)庫適配器City.java覆蓋天氣的城市信息的類.WeatherDemo.ServiceSmsReceiver.java短信監(jiān)聽器WeatherAdapter.java數(shù)據(jù)獲取模塊WeatherService.java后臺服務.WeatherDemo.SMS SimpleSms.java簡化的SMS
17、短信類SmsAdapter.java短信發(fā)送模塊.WeatherDemo.WeatherForecast.java未來信息的類Weather.java當前天氣信息的類Android的資源文件保存在/res的子目錄中:(1)/res/drawable目錄中保存的是圖像文件(2)/res/layout目錄中保存的是布局文件(3)/res/values目錄中保存的是用來定義字符串和顏色的文件(4)/res/xml目錄保存的是XML格式的數(shù)據(jù)文件所有在程序開發(fā)階段可以被調(diào)用的資源都保存在這些目錄中,具體每個資源文件的用途可以參考表3_3。表3_3 資源文件名稱與用途資源目錄文件說明drawableic
18、on.png圖標文件sunny.png調(diào)試用的天氣圖片tab_history.pngTabHost中“歷史數(shù)據(jù)”頁的圖片tab_map.pngTabHost 中“谷歌地圖”頁的圖片tab_setup.pngTabHost中“系統(tǒng)設(shè)置”頁的圖片tab_weather.pngTabHost中“天氣預報”頁的圖片layoutdata_row.xml“歷史數(shù)據(jù)”頁ListActivity的每行數(shù)據(jù)的布局tab_history.xmlTabHost中“歷史數(shù)據(jù)”頁的布局tab_map.xmlTabHost中“谷歌地圖”頁的布局tab_setup.xmlTabHost中“系統(tǒng)設(shè)置”頁的布局tab_weat
19、her.xmlTabHost中“天氣預報”頁的布局valuescolor.xml保存顏色的XML文件string.xml保存字符串的XML文件xmlapi.xml從Google下載的天氣數(shù)據(jù)文件。在程序運行時沒有實際作用,但在開發(fā)過程中可以讓讀者了解數(shù)據(jù)格式3.2 數(shù)據(jù)庫適配器數(shù)據(jù)庫適配器是最底層的模塊,主要用于封裝用戶界面和后臺服務對SQLite數(shù)據(jù)庫的操作,數(shù)據(jù)庫適配器的核心代碼主要在DBAdapter.java文件中,用戶保存配置信息的類文件Config.java。Config.java文件的全部代碼如下package edu.hrbeu.WeatherDemo.DB;publiccla
20、ss Config publicstatic String CityName;publicstatic String RefreshSpeed;publicstatic String ProvideSmsService;publicstatic String SaveSmsInfo;publicstatic String KeyWord;publicstaticvoidLoadDefaultConfig() CityName = chaohu;RefreshSpeed = 20;ProvideSmsService = true;SaveSmsInfo = true;KeyWord = HF;從
21、代碼中不難看出,公有靜態(tài)屬性CityName、RefreshSpeed、ProvideSmsService、SaveSmsInfo和KeyWord,完全對應數(shù)據(jù)庫中保存配置信息表的屬性。在程序啟動后,保存在數(shù)據(jù)庫中的城市名稱、更新頻率、是否提供短信服務、是否保存短信信息和關(guān)鍵字等容,將被寫入這個Config類中,供其他模塊在做邏輯判斷LoadDefaultConfig()函數(shù)保存了程序置的配置參數(shù),此函數(shù)會在兩個情況下被調(diào)用(1)用戶主動選擇“恢復缺省設(shè)置”(2)首次啟動程序時,用來初始化保存配置參數(shù)的數(shù)據(jù)庫DBAdapter類與以往介紹過的數(shù)據(jù)庫適配器類相似,都具有繼承SQLiteOpenH
22、elper的幫助類DBOpenHelper 。DBOpenHelper在建立數(shù)據(jù)庫時,同時建立兩個數(shù)據(jù)庫表,并對保存配置信息的表進行了初始化,初始化的相關(guān)代碼在如下:privatestaticfinal String DB_NAME = weather_app.db;privatestaticfinal String DB_TABLE_CONFIG = setup_config;privatestaticfinal String DB_CONFIG_ID = 1;privatestaticfinalintDB_VERSION = 1;publicstaticfinal String KEY_I
23、D = _id;publicstaticfinal String KEY_CITY_NAME = city_name;publicstaticfinal String KEY_REFRESH_SPEED = refresh_speed;publicstaticfinal String KEY_SMS_SERVICE = sms_service;publicstaticfinal String KEY_SMS_INFO = sms_info;publicstaticfinal String KEY_KEY_WORD = key_word;privatestaticfinal String DB_
24、TABLE_SMS = sms_data;publicstaticfinal String KEY_SENDER = sms_sender;publicstaticfinal String KEY_BODY = sms_body;publicstaticfinal String KEY_RECEIVE_TIME = sms_receive_time;publicstaticfinal String KEY_RETURN_RESULT = return_result;/* 靜態(tài)Helper類,用于建立、更新和打開數(shù)據(jù)庫*/privatestaticclass DBOpenHelper exten
25、ds SQLiteOpenHelper public DBOpenHelper(Context context, String name, CursorFactory factory, int version) super(context, name, factory, version); privatestaticfinal String DB_CREATE_CONFIG = create table + DB_TABLE_CONFIG + ( + KEY_ID + integer primary key autoincrement, +KEY_CITY_NAME+ text not nul
26、l, + KEY_REFRESH_SPEED+ text, +KEY_SMS_SERVICE + text, + KEY_SMS_INFO + text, + KEY_KEY_WORD + text);privatestaticfinal String DB_CREATE_SMS = create table + DB_TABLE_SMS + ( + KEY_ID + integer primary key autoincrement, +KEY_SENDER+ text not null, + KEY_BODY+ text, +KEY_RECEIVE_TIME + text, + KEY_R
27、ETURN_RESULT + text);Overridepublicvoid onCreate(SQLiteDatabase _db) _db.execSQL(DB_CREATE_CONFIG); _db.execSQL(DB_CREATE_SMS);/初始化系統(tǒng)配置的數(shù)據(jù)表 Config.LoadDefaultConfig(); ContentValues newValues = new ContentValues(); newValues.put(KEY_CITY_NAME, Config.CityName); newValues.put(KEY_REFRESH_SPEED, Confi
28、g.RefreshSpeed); newValues.put(KEY_SMS_SERVICE, Config.ProvideSmsService); newValues.put(KEY_SMS_INFO, Config.SaveSmsInfo); newValues.put(KEY_KEY_WORD, Config.KeyWord); _db.insert(DB_TABLE_CONFIG, null, newValues); Overridepublicvoid onUpgrade(SQLiteDatabase _db,int _oldVersion, int _newVersion) _db
29、.execSQL(DROP TABLE IF EXISTS + DB_TABLE_CONFIG); _db.execSQL(DROP TABLE IF EXISTS + DB_CREATE_SMS); onCreate(_db); 在DBAdapter類中,用戶界面會調(diào)用SaveConfig()和LoadConfig(),從SQLite數(shù)據(jù)庫中保存和讀取配置信息。保存配置信息時,SaveConfig()函數(shù)會將Config類中的公有靜態(tài)屬性寫入數(shù)據(jù)庫;反之,LoadConfig()會將數(shù)據(jù)庫中的配置信息寫入Config類中的公有靜態(tài)屬性SaveConfig()和LoadConfig()的代碼如
30、下publicvoid SaveConfig() ContentValues updateValues = new ContentValues(); updateValues.put(KEY_CITY_NAME, Config.CityName); updateValues.put(KEY_REFRESH_SPEED, Config.RefreshSpeed); updateValues.put(KEY_SMS_SERVICE, Config.ProvideSmsService); updateValues.put(KEY_SMS_INFO, Config.SaveSmsInfo); upda
31、teValues.put(KEY_KEY_WORD, Config.KeyWord);db.update(DB_TABLE_CONFIG, updateValues, KEY_ID + = +DB_CONFIG_ID, null); Toast.makeText(context, 系統(tǒng)設(shè)置保存成功,Toast.LENGTH_SHORT).show(); 另一個會調(diào)用DBAdapter類的是后臺服務,即WeatherService類。后臺服務主要調(diào)用SaveOneSms(SimpleSms sms)、DeleteAllSms()和GetAllSms()函數(shù),分別用來保存SMS短信記錄、刪除所有S
32、MS數(shù)據(jù)記錄和獲取所有SMS數(shù)據(jù)記錄。在GetAllSms()函數(shù)中,調(diào)用了一個私有函數(shù)ToSimpleSms(Cursor cursor),用來將從數(shù)據(jù)庫獲取的數(shù)據(jù)轉(zhuǎn)換為SimpleSms對象數(shù)組。SimpleSms類將在下面容中進行介紹下面是SaveOneSms(SimpleSms sms)、DeleteAllSms()和GetAllSms()函數(shù)的代碼:publicvoidSaveOneSms(SimpleSms sms) ContentValues newValues = new ContentValues(); newValues.put(KEY_SENDER, sms.Sender
33、); newValues.put(KEY_BODY, sms.Body); newValues.put(KEY_RECEIVE_TIME, sms.ReceiveTime); newValues.put(KEY_RETURN_RESULT, sms.ReturnResult);db.insert(DB_TABLE_SMS, null, newValues); publiclong DeleteAllSms() returndb.delete(DB_TABLE_SMS, null, null); public SimpleSms GetAllSms() Cursor results = db.q
34、uery(DB_TABLE_SMS, new String KEY_ID, KEY_SENDER, KEY_BODY, KEY_RECEIVE_TIME, KEY_RETURN_RESULT, null, null, null, null, null);return ToSimpleSms(results); private SimpleSms ToSimpleSms(Cursor cursor)int resultCounts = cursor.getCount();if (resultCounts = 0 | !cursor.moveToFirst()returnnull; SimpleS
35、ms sms = new SimpleSmsresultCounts;for (int i = 0 ; iresultCounts; i+) smsi = new SimpleSms(); smsi.Sender = cursor.getString(cursor.getColumnIndex(KEY_SENDER); smsi.Body = cursor.getString(cursor.getColumnIndex(KEY_BODY); smsi.ReceiveTime = cursor.getString(cursor.getColumnIndex(KEY_RECEIVE_TIME);
36、smsi.ReturnResult = cursor.getString(cursor.getColumnIndex(KEY_RETURN_RESULT); cursor.moveToNext(); return sms; 3.3 短信監(jiān)聽器短信監(jiān)聽器本質(zhì)上是BroadcastReceiver,用于監(jiān)聽Android系統(tǒng)所接收到的所有SMS短消息,可以在應用程序關(guān)閉后仍然繼續(xù)運行,核心代碼在SmsReceiver.java文件中。在介紹SmsReceiver類前,先說明用來保存SMS短信容和相關(guān)信息的SimpleSms類。android.telephony.gsm.SmsMessage是And
37、roid提供的短信類,但這里需要一個更精簡、小巧的類,保存少量的信息,因此構(gòu)造了SimpleSms類,僅用來保存短信的發(fā)送者、容、接收時間和返回結(jié)果。這里的“返回結(jié)果”指的是返回包含天氣信息的短信容SimpleSms.java文件完整代碼如下:package edu.hrbeu.WeatherDemo.SMS;import java.text.SimpleDateFormat;publicclass SimpleSms public String Sender;publicString Body;public String ReceiveTime;public String ReturnRes
38、ult;public SimpleSms()public SimpleSms(String sender, String body)this.Sender = sender;this.Body = body;SimpleDateFormat tempDate = new SimpleDateFormat(yyyy-MM-dd + + hh:mm:ss);this.ReceiveTime = tempDate.format(new java.util.Date();this.ReturnResult = ;上述代碼的屬性Sender、Body、ReceiveTime和ReturnResult,分
39、別表示SMS短信的發(fā)送者、容、接收時間和返回結(jié)果。上述代碼在SimpleSms類的構(gòu)造函數(shù)中,直接將系統(tǒng)時間以“年-月-日小時:分:秒”的格式保存在ReceiveTime屬性中。SmsReceiver類繼承BroadcastReceiver,重載了onReceive()函數(shù)。其實系統(tǒng)消息的識別和系統(tǒng)關(guān)鍵字的識別并不復雜,我們只要能夠接收到vider.Telephony.SMS_RECIVED類型的系統(tǒng)消息,則表明是Android系統(tǒng)接收到了短信;將短信的容拆分后,判斷消息容是否是配置信息中定義的關(guān)鍵字,即可判斷該短信是否為天氣服務請求短信。SmsReceiver.java文件的核心代碼publ
40、icclass SmsReceiver extends BroadcastReceiver privatestaticfinal String SMS_ACTION = vider.Telephony.SMS_RECEIVED;Overridepublicvoid onReceive(Context context, Intent intent) if (intent.getAction().equals(SMS_ACTION) Bundle bundle = intent.getExtras();if (bundle != null) Object objs = (Object) bundl
41、e.get(pdus);SmsMessage messages = new SmsMessageobjs.length;for (int i = 0; i objs.length; i+) messagesi = SmsMessage.createFromPdu(byte) objsi);String smsBody = messages0.getDisplayMessageBody();String smsSender = messages0.getDisplayOriginatingAddress();if (smsBody.trim().equals(Config.KeyWord)& C
42、onfig.ProvideSmsService.equals(true) SimpleSms simpleSms = new SimpleSms(smsSender, smsBody);WeatherService.RequerSMSService(simpleSms);Toast.makeText(context, 接收到服務請求短信, Toast.LENGTH_SHORT).show();第10行代碼將帶有pdus字符串特征的對象,通過Bundle.get()函數(shù)提取出來,在第12行代碼使用SmsMessage.CreateFromPdu()函數(shù)構(gòu)造SmsMessage對象,在第11行代碼
43、使用循環(huán)語句是因為接收到的短信可能不止一條,從第14行和第15行代碼上看,這里只處理第1條短信,第17行代碼構(gòu)造SimpleSms對象,在代碼第18行調(diào)用WeatherService類的RequerSMSService()函數(shù),將SimpleSms對象添加到短信隊列中在AndroidManifest.xml文件中注冊短信監(jiān)聽器SmsReceiver,并聲明可以接收短信的用戶許可android.permission.RECEIVE_SMS 如果注冊的組件不在根命名空間中,則需要將子命名空間寫在類的前面。例如下面在代碼第1行中,因為SmsReceiver.java文件在edu.hrbeu.Weat
44、herDemo.Service命名空間下,而不在根命名空間edu.hrbeu.WeatherDemo下,因此注冊組件時需要在類名SmsReceiver前添加.Service3.4 后臺服務后臺服務是WeatherDemo示例的核心模塊,在用戶啟動后持續(xù)在后臺運行,直到用戶手動停止服務。后臺服務功能:一是發(fā)送包含天氣信息的SMS短信(短信發(fā)送模塊)二是周期性的獲取Yahoo的天氣數(shù)據(jù)(數(shù)據(jù)獲取模塊)3.4.1短信發(fā)送模塊后臺服務在單獨的線程上運行,首先調(diào)用ProcessSmsList()函數(shù),檢查短信隊列中是否有需要回復的短信,然后調(diào)用GetGoogleWeatherData()函數(shù)獲取天氣數(shù)據(jù)
45、,最后線程暫停1秒,以釋放CPU資源,WeatherDemo示例后臺服務的核心代碼在WeatherService.java文件中下面是線程調(diào)用函數(shù)的部分代碼如下所述:private static ArrayListsmslist=new ArrayList();private Runnable backgroudWork = new Runnable() Overridepublicvoid run() try while (!Terrupted() ProcessSmsList();GetGoogleWeatherData();Thread.sleep(1000);catch (Interr
46、uptedException e) e.printStackTrace();ProcessSmsList()函數(shù)用來檢查短信列表smsList,并根據(jù)Weather類中保存的天氣數(shù)據(jù),向請求者的發(fā)送回復短信,WeatherService.java文件的ProcessSmsList()函數(shù)代碼如下:privatevoidProcessSmsList() if (smsList.size() = 0) return;SmsManager smsManager = SmsManager.getDefault();PendingIntent mPi = PendingIntent.getBroadca
47、st(this, 0, new Intent(), 0);while (smsList.size() 0) SimpleSms sms = smsList.get(0);smsList.remove(0);smsManager.sendTextMessage(sms.Sender, null, Weather.GetSmsMsg(),mPi, null);sms.ReturnResult = Weather.GetSmsMsg();SaveSmsData(sms);發(fā)送短信是使用SmsManager對象的sendTextMessage()方法,該方法一共需要5個參數(shù):第1個參數(shù)是收件人地址,第
48、2個參數(shù)是發(fā)件人地址,第3個參數(shù)是短信正文,第4個參數(shù)是發(fā)送服務,第5個參數(shù)是送達服務。sendTextMessage()方法的收件人地址和短信正文是不可為空的參數(shù),而且一般GSM規(guī)要求短信容要控制在70個漢字以。代碼第8行的Weather.GetSmsMsg(),用來獲得供回復短信使用的天氣信息,因為考慮到短信的字數(shù)限制,僅返回當天和未來一天的天氣狀況。Weather.java文件的代碼如下:package edu.hrbeu.WeatherDemo.Weather;import android.graphics.Bitmap;publicclass Weather publicstatic
49、 String city;publicstatic String code;publicstatic String country;publicstatic String tLowT;publicstatic String tHighT;publicstatic String temp;publicstatic String tDescription;publicstatic String latitude;publicstatic String longitude;publicstatic String time;publicstatic String day_of_week;publics
50、tatic String current_image_url;publicstatic Bitmap current_image;publicstatic Forecast forecast = new Forecast2;static for (int i = 0; i forecast.length; i+) forecasti = new Forecast();publicstatic String GetSmsMsg() String msg = ;msg += city + ,;msg += country + , + latitude + . + longitude;msg +=
51、, +day_of_week + , + tDescription + , + temp + ;return msg;Forecast.java文件的代碼如下:package edu.hrbeu.WeatherDemo.Weather;import android.graphics.Bitmap;publicclass Forecast public String day_of_week;public String low;public String high;public String image_url;public Bitmap image;public String condition
52、;3.4.2數(shù)據(jù)庫獲取模塊數(shù)據(jù)獲取模塊:天氣數(shù)據(jù)是從Yahoo提供的Web Service中獲取的,數(shù)據(jù)的獲取地址是HYPERLINK :/xml.weather.yahoo /forecastrss?p=CHXX0037&u=cxml.weather./forecastrss?p=CHXX0037&u=c,CHXX0037表示獲取的天氣數(shù)據(jù),讀者可以替換CHXX0037,并將新的地址輸入Web瀏覽器,在瀏覽器中可以直接看到XML格式的天氣數(shù)據(jù)。在資源目錄中的/res/xml/api.xml文件,就是2012年12月16日獲取的天氣數(shù)據(jù),在程序資源中保留api.xml文件,主要是用來幫助讀者分
53、析XML數(shù)據(jù)格式,在程序運行期間并不訪問該文件。api.xml文件的容如下:Yahoo! Weather - Guangzhou, CHus.rd./dailynews/rss/weather/Guangzhou_CH/*weather./forecast/CHXX0037_c.htmlYahoo! Weather for Guangzhou, CHen-usSun, 16 Dec 2012 10:00 am CST60Yahoo! Weather14218weather.l.yimg./a/i/brand/purplelogo/uh/us/news-wea.gifConditions for
54、 Guangzhou, CH at 10:00 am CST23.12113.3us.rd./dailynews/rss/weather/Guangzhou_CH/*weather./forecast/CHXX0037_c.htmlSun, 16 Dec 2012 10:00 am CST!CDATACurrent Conditions:Fog, 24 CForecast:Sun - Partly Cloudy. High: 26 Low: 16Mon - Partly Cloudy. High: 24 Low: 16Full Forecast at Yahoo! Weather(provid
55、ed by The Weather Channel)CHXX0037_2012_12_17_7_00_CSTWeatherAdapter類實現(xiàn)了利用URL獲取位圖的私有函數(shù)GetURLBitmap(),以與用來下載和解析XML數(shù)據(jù)的公有函數(shù)GetWeatherData()。后臺服務在調(diào)用GetWeatherData()函數(shù)解析Yahoo提供的天氣數(shù)據(jù)時,會不斷調(diào)用GetURLBitmap()函數(shù),將XML數(shù)據(jù)中的天氣圖標根據(jù)圖標地址下載到本地保存。GetURLBitmap()函數(shù)的代碼如下:privatestatic Bitmap GetURLBitmap(String urlString)
56、URL url = null;Bitmap bitmap = null;try url = new URL(l.yimg./a/i/us/we/52/ + urlString+ .gif);catch (MalformedURLException e) e.printStackTrace();try URLConnection conn = ( URLConnection) url.openConnection();conn.connect();InputStream is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(
57、is);is.close();catch (IOException e) e.printStackTrace();return bitmap;getweather ()函數(shù)首先根據(jù)指定的URL地址,從網(wǎng)絡(luò)獲取字節(jié)流數(shù)據(jù),然后調(diào)用輕量級XML解析器XmlPullParser對天氣數(shù)據(jù)進行解析,并將解析結(jié)果保存在Weather類的公有靜態(tài)屬性中g(shù)etweather ()函數(shù)的代碼如下:publicstaticvoid getWeather() throws MalformedURLException,XmlPullParserException, IOException String value
58、= City.getCode(Config.CityName);String queryString = xml.weather./forecastrss?w=+ value + &u=c;System.out.println(queryString);System.out.println(Config.CityName)XmlPullParser parser = Xml.newPullParser();parser.setInput(new URL(queryString).openConnection().getInputStream(),UTF-8);int code = parser
59、.getEventType();String preString = null;int position = 0;while (code != XmlPullParser.END_DOCUMENT) switch (code) case XmlPullParser.START_TAG:preString = parser.getName();if(preString.equals(location) Weather.city = parser.getAttributeValue(0);Weather.country = parser.getAttributeValue(2);elseif (p
60、reString.equals(condition) Weather.tDescription = parser.getAttributeValue(0);Weather.current_image_url = parser.getAttributeValue(1);Weather.temp = parser.getAttributeValue(2);Weather.day_of_week = parser.getAttributeValue(3);Weather.current_image = GetURLBitmap(Weather.current_image_url);elseif (p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能交通系統(tǒng)在城市管理中的應用與前景
- 商業(yè)空間裝修協(xié)議書樣本
- 停車場智能管理公司
- 現(xiàn)代農(nóng)業(yè)金融創(chuàng)新方案
- 新型智能穿戴產(chǎn)品設(shè)計手冊
- 電信行業(yè)智能化通信網(wǎng)絡(luò)智能化管理與維護方案
- 豆制品加工項目可行性報告
- 長興垃圾焚燒發(fā)電項目
- 商貿(mào)城項目可行性研究報告
- 關(guān)于提升員工職業(yè)技能的培訓教程與計劃安排
- GB/T 11766-2008小米
- 初中英語語法大全知識點總結(jié)可打印
- 醫(yī)患溝通技巧培訓試題及答案
- FANUCROBOSHOTSi注塑機操作說明書學習課件
- 2023遼寧醫(yī)藥職業(yè)學院單招數(shù)學模擬試題(附答案解析)
- 變更風險識別、評估記錄表參考模板范本
- 南京長安汽車有限公司環(huán)保搬遷(置換升級)項目環(huán)境影響報告表
- 人工挖孔樁施工危險源辨識與評價及應對措施
- 品管圈成果匯報——提高導管固定正確率PPT課件
- 2018年真分數(shù)假分數(shù)PPT課件
- 及成品SN編碼規(guī)則
評論
0/150
提交評論