文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2012)12-0126-04
隨著3G業(yè)務(wù)的全面推廣,使用手機(jī)進(jìn)行實(shí)時(shí)交流的需求也越來(lái)越大,短信服務(wù)由于其快捷方便和良好的交互性[1]廣受青睞。通常使用手機(jī)發(fā)送短信的形式比較單一,在需要發(fā)送信息時(shí)必須由人工干預(yù)將短信發(fā)送給一個(gè)或多個(gè)聯(lián)系人,而且同時(shí)發(fā)給多人時(shí),短信內(nèi)容相同。而人們?cè)诜泵Φ墓ぷ骱蛯W(xué)習(xí)中往往會(huì)忘記一些必要的短信祝福、合作提醒等。為了解決這一問(wèn)題,本文在Android平臺(tái)下,采用SharedPreferences、SQLite進(jìn)行數(shù)據(jù)存儲(chǔ),利用Service組件實(shí)現(xiàn)系統(tǒng)后臺(tái)運(yùn)行,使用BaseAdapter適配器進(jìn)行用戶(hù)界面顯示,設(shè)計(jì)了一個(gè)自發(fā)短信系統(tǒng)。該系統(tǒng)可以隨意設(shè)置短信內(nèi)容、發(fā)送時(shí)間,在指定的時(shí)間當(dāng)天,由系統(tǒng)自動(dòng)給好友、生意伙伴等發(fā)送祝福短信、合作提醒,也可以設(shè)置給多人發(fā)送不同的短信。
1 Android系統(tǒng)
Android是Google開(kāi)發(fā)的基于Linux開(kāi)放性?xún)?nèi)核的手機(jī)操作系統(tǒng),目前已廣泛應(yīng)用于智能手機(jī)中。Android系統(tǒng)的軟件結(jié)構(gòu)包含操作系統(tǒng)、中間件及一些關(guān)鍵的平臺(tái)應(yīng)用程序。該系統(tǒng)采用軟件堆層(Software Stack)的架構(gòu)[2-3],主要分為4個(gè)部分:(1)應(yīng)用層,采用Java語(yǔ)言編寫(xiě),運(yùn)行在Dalvik虛擬機(jī),供用戶(hù)使用的應(yīng)用程序;(2)應(yīng)用框架層,使用API框架編寫(xiě)Google發(fā)布的核心應(yīng)用,開(kāi)發(fā)人員可以使用這些框架開(kāi)發(fā)自己的應(yīng)用; (3)系統(tǒng)運(yùn)行庫(kù)層;(4)Linux內(nèi)核層,即硬件和軟件棧之間的抽象層,提供了Android系統(tǒng)的核心服務(wù)。
2 系統(tǒng)設(shè)計(jì)
自發(fā)短信系統(tǒng)是用戶(hù)預(yù)先設(shè)定的信息內(nèi)容和發(fā)送時(shí)間的好友列表,系統(tǒng)每24 h檢測(cè)一次好友信息。當(dāng)好友的發(fā)送時(shí)間與手機(jī)設(shè)定時(shí)間一致時(shí),就將該好友添加到發(fā)送集合中,由系統(tǒng)自動(dòng)完成定制短信的發(fā)送。
2.1 系統(tǒng)功能設(shè)計(jì)
按照用戶(hù)使用短信服務(wù)的習(xí)慣和需求,自發(fā)短信系統(tǒng)的主要功能模塊如圖1所示。
(1)好友管理模塊:顯示已添加的好友信息(包括頭像、姓名、倒計(jì)時(shí)天數(shù)及發(fā)送狀態(tài)等);添加、修改、刪除好友信息。
(2)短信管理模塊:顯示用戶(hù)設(shè)置的待發(fā)送短信內(nèi)容;修改短信內(nèi)容。
(3)后臺(tái)檢測(cè)服務(wù)模塊:該模塊不間斷地在后臺(tái)運(yùn)行,檢測(cè)好友列表中的發(fā)送日期與手機(jī)日期是否相同。如果相同,則根據(jù)選定的短信內(nèi)容自動(dòng)地向該好友發(fā)送信息,并在發(fā)送完成后修改發(fā)送狀態(tài)信息。如果不相同,則修改倒計(jì)時(shí)天數(shù)。
2.2 數(shù)據(jù)存儲(chǔ)設(shè)計(jì)
隨著軟件應(yīng)用程序逐漸模塊化,嵌入式數(shù)據(jù)庫(kù)可直接在應(yīng)用程序進(jìn)程中運(yùn)行,提供了零配置運(yùn)行模式,并且資源占用非常少。Android系統(tǒng)支持多種數(shù)據(jù)存儲(chǔ)技術(shù),其中有簡(jiǎn)單信息存儲(chǔ)方式SharedPreferences[4],也有內(nèi)存占用少、效率高。支持 SQL 語(yǔ)言的輕量級(jí)嵌入式數(shù)據(jù)庫(kù)引擎——SQLite。在進(jìn)行開(kāi)發(fā)設(shè)計(jì)時(shí),結(jié)合功能需求和軟件性能,本系統(tǒng)采用了SharedPreferences進(jìn)行簡(jiǎn)單短信信息存儲(chǔ),及SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)量較大的好友信息。
短信信息以sms_db.xml為文件名,存儲(chǔ)在默認(rèn)位置/data/data/<包名>/shared_prefs目錄下,其內(nèi)容格式如下:
<?xml version=′1.0′encoding=′utf-8′standalone=′yes′?>
<map>
<string name="sms1">祝寶貝生日快樂(lè),天天開(kāi)心!</string>
<string name="sms2">開(kāi)業(yè)大吉,生意興??!</string>
……
</map>
數(shù)據(jù)庫(kù)myinformation.db存儲(chǔ)好友信息,結(jié)構(gòu)如表1所示。
3 系統(tǒng)功能實(shí)現(xiàn)
系統(tǒng)整體使用MVC模式設(shè)計(jì),將數(shù)據(jù)(Model)、界面(View)、控制(Controller)分為不同的模塊,不僅使程序結(jié)構(gòu)更加清晰,代碼更加健壯,而且降低了程序之間的耦合度,提高了模塊化程度[5]。
3.1 好友管理
3.1.1 好友列表顯示界面
系統(tǒng)運(yùn)行后,首先調(diào)用MainActivity.java顯示主界面,如圖2所示。主界面上的好友列表由ListView組件來(lái)實(shí)現(xiàn),該組件中的數(shù)據(jù)由繼承了BaseAdapter自定義的MainListAdapter適配器類(lèi)來(lái)填充。實(shí)現(xiàn)代碼如下:
Cursor c = managedQuery(MyInformation.CONNECT_URI,
MyInformation.SelectStrArr, null, null,MyInformation.DEFAULT_
SORT_ORDER);
List<User> mList = new ArrayList<User>();
c.moveToFirst(); // 實(shí)例化游標(biāo)對(duì)象,查找數(shù)據(jù)庫(kù)
if (c.getCount() > 0) {
do {
mList.add(new User(c));
} while (c.moveToNext());
}
c.close();
ListView mainListView = (ListView) findViewById(R.id.
mainlist); // 添加用戶(hù)到集合
MainListAdapter mainListAdapter = new MainListAdapter
(this, mList); // 實(shí)例化自定義適配器
mainListView.setAdapter(mainListAdapter);
// 給ListView設(shè)置適配器
3.1.2 添加好友信息界面
用戶(hù)單擊圖3主界面上的“添加好友”菜單后,將執(zhí)行如下代碼:
Intent intentAdd = new Intent(MainActivity.this, InformationAdd.class);
MainActivity.this.startActivity(intentAdd)
然后顯示如圖3所示“添加好友信息”界面。通過(guò)此界面,可以設(shè)置好友姓名、電話號(hào)碼、定時(shí)發(fā)送時(shí)間(生日)、定時(shí)開(kāi)啟狀態(tài)及短信內(nèi)容。短信內(nèi)容可以單獨(dú)設(shè)置,也可以點(diǎn)擊“選擇已有的祝福”按鈕選擇定制短信。
3.2 短信管理
用戶(hù)單擊圖2主界面上的“編輯短信”菜單后,執(zhí)行PrepareSms類(lèi),該類(lèi)繼承Avtivity類(lèi),實(shí)現(xiàn)了OnClickListener接口。然后進(jìn)入短信顯示界面,通過(guò)自定義SelectSharedPreferencesDb類(lèi)實(shí)例對(duì)象的getSMS( )方法讀取sms_db.xml文件,并把短信內(nèi)容顯示在TextView上。單擊短信顯示文本框TextView,進(jìn)入短信內(nèi)容編輯界面,如圖4所示。編輯完成后調(diào)用saveSMS()方法保存短信內(nèi)容到sms_db.xml文件,代碼如下:
public class SelectSharedPreferencesDb {
public static Map<String, String> getSMS(Context con) {
Map<String, String> map=new HashMap<String, String>();
SharedPreferences mysp = con.getSharedPreferences
("sms_db",Activity.MODE_PRIVATE); // 獲取sms
map.put("sms1", mysp.getString("sms1", "寶貝!祝你生日快樂(lè)?。?quot;));
for (int i = 2; i < 11; i++) {
String content = mysp.getString("sms" + i, "未設(shè)置");
map.put("sms" + i, content);}
return map;
} //默認(rèn)有第一條短信內(nèi)容,可以修改
public static void saveSMS(Context con, String num, String smscontent) {
SharedPreferences mysp = con.getSharedPreferences
("sms_db", Activity.MODE_PRIVATE);
mysp.edit().putString(num, smscontent).commit(); }
} // 保存sms
3.3 后臺(tái)檢測(cè)服務(wù)
為了實(shí)現(xiàn)系統(tǒng)在指定日期自發(fā)短信,必須啟動(dòng)監(jiān)聽(tīng)測(cè)試服務(wù),并且始終在后臺(tái)運(yùn)行,每隔24 h自動(dòng)檢測(cè)手機(jī)日期與指定日期是否一致,并作相應(yīng)處理。Android系統(tǒng)提供了Service組件來(lái)實(shí)現(xiàn)服務(wù)的后臺(tái)運(yùn)行[6],通過(guò)實(shí)現(xiàn)Runnable接口的方法啟動(dòng)線程對(duì)短信發(fā)送日期進(jìn)行檢測(cè)。本系統(tǒng)自定義一個(gè)MainService類(lèi),它繼承了Service,實(shí)現(xiàn)了Runnable接口具體實(shí)現(xiàn)功能。
3.3.1 Service后臺(tái)服務(wù)
Service組件與Activity組件類(lèi)似,但它一直在后臺(tái)運(yùn)行,沒(méi)有用戶(hù)界面[7],該組件的啟動(dòng)有兩種方式:context.startService()和context.bindService()。開(kāi)發(fā)步驟如下:
(1) 繼承Service類(lèi)
public class MainService extends Service implements Runnable {……}
(2)在AndroidManifest.xml文件中的<application>節(jié)點(diǎn)里對(duì)服務(wù)進(jìn)行配置
<service android:name="ie.nnutc.edu.cn.MainService" >
<intent-filter>
<action android:name= "ie.nnutc.edu.cn.MainService "/ >
</intent-filter>
</service>
(3) 啟動(dòng)Service
Intent it = new Intent("ie.nnutc.edu.cn.MainService ");
this.startService(it)
3.3.2 實(shí)現(xiàn)時(shí)間檢測(cè)和短信發(fā)送線程
在Java中通過(guò)繼承Thread類(lèi)和實(shí)現(xiàn)Runnable接口兩種方式實(shí)現(xiàn)多線程,但由于一個(gè)類(lèi)只能繼承一個(gè)父類(lèi)[8],而MainService類(lèi)已經(jīng)繼承了Service類(lèi),所以本系統(tǒng)采用Runnable接口來(lái)實(shí)現(xiàn)時(shí)間檢測(cè)和短信發(fā)送線程。
當(dāng)檢測(cè)到發(fā)送日期與手機(jī)日期相同時(shí),將好友信息加入發(fā)送集合,產(chǎn)生一個(gè)Message類(lèi)信號(hào)放入消息隊(duì)列,并分發(fā)給Handler進(jìn)行處理。Handler接收到消息后啟動(dòng)短信發(fā)送代碼(本系統(tǒng)將該功能封裝成sendmessage方法)實(shí)現(xiàn)短信發(fā)送。部分代碼如下:
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SEND_MESSAGE:
sendmessage(……); //執(zhí)行自發(fā)短信任務(wù)
break;
}
super.handleMessage(msg);
}
}
結(jié)合Android系統(tǒng)手機(jī)用戶(hù)的實(shí)際需要,本文基于SQLite存儲(chǔ)技術(shù)、Service后臺(tái)服務(wù)技術(shù)和消息處理機(jī)制設(shè)計(jì)了自發(fā)短信系統(tǒng),成功地解決了按時(shí)發(fā)送定制信息這一問(wèn)題。通過(guò)實(shí)際項(xiàng)目驗(yàn)證了設(shè)計(jì)的正確性和可行性。隨著3G的到來(lái),利用 Android系統(tǒng)提供的拍照、錄音等功能,也可實(shí)現(xiàn)圖片、音頻等多媒體信息的自動(dòng)發(fā)送,從而使自發(fā)短信系統(tǒng)的應(yīng)用前景更加廣泛。
參考文獻(xiàn)
[1] 沈冰,陳向東,黃馨竹,等.基于J2ME技術(shù)的短信智能回復(fù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2007,24 (12):263-265.
[2] 王向輝,張國(guó)印,沈潔.Android應(yīng)用程序開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2010.
[3] 姚昱昱,劉衛(wèi)國(guó).Android的架構(gòu)與應(yīng)用開(kāi)發(fā)研究[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,17(11):110-112.
[4] 郭宏志.Android應(yīng)用開(kāi)發(fā)詳解[M].北京:電子工業(yè)出版 社,2010.
[5] GAO J,MODAK M,DORNADULA S,et al. A wirelessbased text chatting system[C]. 2004 IEEE International Conference on E-Commerce Technology, 2004.
[6] 張?jiān)粒瓵ndroid開(kāi)發(fā)應(yīng)用實(shí)戰(zhàn)詳解[M].北京:中國(guó)鐵道出版社,2010.
[7] 王秀芳,楊陽(yáng).基于Android的YOBO在線音樂(lè)播放器[J]. 科學(xué)技術(shù)與工程,2011,11(11):2506-2509.
[8] 張雪萍,鮑丹,王家耀.Java多線程測(cè)試策略及測(cè)試方法探討[J].計(jì)算機(jī)應(yīng)用研究,2006,23(11):12-14.