摘要:本文主要介紹百度個人云存儲(PCS)作為數(shù)據(jù)存儲服務(wù)器,百度轉(zhuǎn)碼技術(shù)實現(xiàn)Web網(wǎng)頁到WAP網(wǎng)頁轉(zhuǎn)換,ActivityManager優(yōu)化管理Activity等技術(shù)在基于Android的駕校通軟件開發(fā)過程中的實際應(yīng)用。
關(guān)鍵詞:百度個人云存儲(PCS) 百度轉(zhuǎn)碼技術(shù) Activity管理
0 引言
駕校通是基于Android系統(tǒng)開發(fā)的一款考試輔助軟件,它消除傳統(tǒng)的書本練習(xí)和網(wǎng)頁版練習(xí)軟件的不易攜帶、功能單一、網(wǎng)絡(luò)流量、網(wǎng)絡(luò)信號等各種因素的影響,集成現(xiàn)代電子考試的特點,包含最新的試題庫信息,如圖片題、單選題、多選題,提供多種方式練習(xí)功能,如章節(jié)練習(xí)、隨機練習(xí)、模擬練習(xí)、錯題集等功能,還集成一些常用的、實用的小工具供用戶使用,是駕校練習(xí)人員非常需要的一款實用軟件。
1 系統(tǒng)設(shè)計
1.1 系統(tǒng)設(shè)計模式 本軟件采用MVC(Model-View-
Controller)模式。Model為模型層,主要實現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯和數(shù)據(jù)訪問,通常可以用JavaBean或EJB來實現(xiàn)。View為視圖,用于向用戶展示數(shù)據(jù)。Controller層是Model與View之間溝通的橋梁,它是將用戶請求轉(zhuǎn)發(fā)給模型層,經(jīng)過處理后把結(jié)果返回到界面層展現(xiàn)的一個中間層,實現(xiàn)View層跟Model層的協(xié)同工作。
1.2 軟件配置環(huán)境 運行環(huán)境:android2.2及以上版本
開發(fā)工具:eclipse 3.7
Java虛擬機版本:Windows下或Linux下JDK1.6以上版本.
Ant:Version 18
2 駕校通軟件中主要技術(shù)的應(yīng)用
2.1 使用SQLite數(shù)據(jù)庫 SQLite是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),SQLite引擎主要的通信協(xié)議是在編程語言內(nèi)的直接API調(diào)用。對于軟件整體簡單性設(shè)計、系統(tǒng)內(nèi)存消耗在有明顯性能優(yōu)越性。SQLite雖然很小巧,但是對于SQL語句的支持不會遜色于其他開源數(shù)據(jù)庫,同時它還支持事務(wù)處理功能等等。
SQLite具有以下優(yōu)點:輕量級:SQLite是進程內(nèi)的數(shù)據(jù)庫引擎,它的核心引擎本身不依賴第三方的軟件,使用時一般只需要帶上它的一個動態(tài)庫。單一文件:即是數(shù)據(jù)庫中所有的信息(例如表、視圖等)均包含在一個完整的文件內(nèi)。此文件可以復(fù)制到其它目錄或其它機器上,均可正常使用。此外,SQLite具有跨平臺/可移植性,安裝部署極為方便。
基于以上SQLite特點與駕校考試的需求,本軟件中附帶的考試題庫存放在本地SQLite數(shù)據(jù)庫中,使得用戶進行練習(xí)和模擬測試不受到必須聯(lián)網(wǎng)和瀏覽的限制,軟件響應(yīng)速度極快。
2.2 使用百度個人云存儲(PCS) 百度個人云存儲是百度公司推出的針對開發(fā)者的云存儲服務(wù)。開發(fā)者開發(fā)的應(yīng)用在得到用戶授權(quán)后,可以通過調(diào)用PCS Open API的方式為用戶提供文件和數(shù)據(jù)管理服務(wù),完成用戶文件和數(shù)據(jù)的存儲、管理、備份、同步等功能。在百度服務(wù)器端,PCS以高可靠的安全認證機制以及數(shù)據(jù)冗余備份保護機制保障用戶的數(shù)據(jù)安全,因此開發(fā)者可以毫無顧慮地將應(yīng)用推薦給用戶使用,而不必擔心用戶數(shù)據(jù)泄露或者丟失。開發(fā)者無需負擔巨大的存儲成本,就能獲得高速、高可用、高穩(wěn)定、高安全性的百度服務(wù),在此基礎(chǔ)上輕松快速地開發(fā)出有創(chuàng)意的應(yīng)用。基于百度個人云存儲技術(shù)優(yōu)點,本軟件“在線文庫”中使用了百度的個人云存儲技術(shù),方便用戶從服務(wù)器上下載所需資料。
開發(fā)百度云存儲步驟如下:①登錄官方網(wǎng)址www.developer.com上創(chuàng)建一個開發(fā)者賬號。創(chuàng)建應(yīng)用“測試”,獲取API Key和Secret Key。申請開通PCS API的權(quán)限。下載Baidu-PCS-SDK-Android-L2-2.1.0.zip解壓后把相關(guān)jar文件附加到本地的應(yīng)用項目中。
②獲取Access_token。Access_token 可以簡單的理解為操作百度個人云存儲必須的授權(quán)碼,官方推薦使用OAuth2.0方式來獲取Access_token。OAuth2.0是一個開放標準,第三方應(yīng)用得到用戶授權(quán)后,無需獲取用戶的用戶名和密碼便可以訪問該用戶在某一網(wǎng)站上存儲的個人的資源。
Access_token:用戶身份驗證和授權(quán)的憑證。第三方應(yīng)用在調(diào)用百度開放API之前,首先需要獲取Access_token。目前,百度OAuth2.0支持五種獲取Access_token的流程和一種刷新獲取Access_token方式,第三方可根據(jù)需求選取合適的方式。本軟件使用的是“Implicit Grant”這種方式來獲取Access_token。
Implicit Grant又稱User-Agent Flow,適用于所有無Server端配合的應(yīng)用(桌面客戶端需要內(nèi)嵌瀏覽器)。為了獲取Access_token,應(yīng)用需要將用戶瀏覽器到百度OAuth2.0授權(quán)服務(wù)的“https://openapi.baidu.com/oauth/
2.0/authorize”地址上,并帶上以下參數(shù):
client_id:必須參數(shù)。注冊應(yīng)用時獲得的API Key。
response_type:必須參數(shù)。此值固定為“token”。
redirect_uri:必須參數(shù)。其值是“oob”。
scope:非必須參數(shù)。以空格分隔的權(quán)限列表,若不傳遞此參數(shù),代表請求用戶的默認權(quán)限。關(guān)于權(quán)限的具體信息請參考“權(quán)限列表”。
state:非必須參數(shù)。用于保持請求和回調(diào)的狀態(tài),授權(quán)服務(wù)器在回調(diào)時(重定向用戶瀏覽器到“redirect_uri”時),會在Fragment中原樣回傳該參數(shù)。
display:非必須參數(shù)。登錄和授權(quán)頁面的展現(xiàn)樣式,默認為“page”。
force_login:非必須參數(shù),例如傳遞“force_login=1”,則加載登錄頁時強制登錄用戶輸入用戶名與口令,瀏覽器不會從cookie中讀取百度用戶的登陸狀態(tài)。
confirm_login:非必須參數(shù),例如傳遞“confirm_login=1”,若此時百度用戶已經(jīng)是處于登陸的狀態(tài),則會提示是否使用已當前登陸用戶對應(yīng)用授權(quán)。
為了加強安全性,會對跳轉(zhuǎn)到該授權(quán)頁面的Referer進行檢測,要求Referer必須與開發(fā)者創(chuàng)建應(yīng)用時注冊的“網(wǎng)站地址”或者在“OAuth安全設(shè)置”中所填寫的“根域名綁定”同域。
在瀏覽器中輸入如下地址:https://openapi.baidu.com/oauth/2.0/authorize?response_type=tokenclient_
id=UrPlY2RqDvsTEIvGrGZxktbqrediect_uri=oobscop
e=netdiskdisplay=popupstate=xxx,瀏覽器會跳轉(zhuǎn)到開發(fā)者登錄和開發(fā)者制制授權(quán)界面,開發(fā)者輸入賬號與密碼,登錄、授權(quán)后,在瀏覽器的地址欄中會得到如下格式的地址:http://openapi.baidu.com/oauth/2.0/login_success
#expires_in=2592000access_token=3.8f9d01b41abe88
686cc7105f8cab61f9.2592000.1372320849.3794308355-902080session_secret=ebf2511f1cde723af462dc3
ac4a1323esession_key=94rryYDFTnyBMYv%2FrqNET
oyj9ze3eHsc%2BWashxWIJwOmZ%2BihGBuAYaOPzh
69XYNw7eOXOI39rIioI1tX%2BHsi1gvooahaPjg%3Ds
cope=basic+netdiskstate=xxx
此時從上述地址中可以得到Access_token= 3.8f9d
01b41abe88686cc7105f8cab61f9.2592000.1372320849.3794308355-902080
③在項目中使用Access_token:百度個人云存儲開發(fā)關(guān)鍵代碼:
String s_accessToken =\"3.8f9d01b41abe88686cc7
105f8cab61f9.2592000.1372320849.3794308355-902080\";
String s_approot = \"/apps/駕校通/\";
PcsClient pscClient = new PcsClient(s_accessToken, s_approot);
pscClient.downloadToFile(remotepath, localpath); //從服務(wù)器上下載文件
List
開發(fā)登錄百度網(wǎng)盤(http://pan.baidu.com)后,在這里可以方便的更新服務(wù)器的數(shù)據(jù)。
2.3 使用百度轉(zhuǎn)碼技術(shù) 為確保WAP可用性,必須對WAP搜索結(jié)果中的WEB網(wǎng)頁進行格式轉(zhuǎn)換,轉(zhuǎn)換為WAP網(wǎng)頁,使其能在移動終端瀏覽器被瀏覽,提高用戶的瀏覽速度和節(jié)省傳輸流量,本軟件調(diào)用了百度的轉(zhuǎn)碼技術(shù)。關(guān)鍵代碼如下:
RSSEntity rssEntity = list.get(position);
Intent intent = new Intent(CarInfoActivity.this,WebViewActivity.class);
//使用百度的轉(zhuǎn)碼技術(shù)(修改訪問的地址),使用頁面更適合手機的閱讀
intent.putExtra(\"resId\",\"http://gate.baidu.com/tc?from=opentcsrc=\"+uri);
intent.putExtra(\"isOpenInSelft\", true);
intent.putExtra(\"title\", rssEntity.getTitle());
startActivity(intent);
2.4 使用ActivityManager優(yōu)化管理Activity 在日常的Android的開發(fā)技術(shù)中,讓程序員感覺非常的頭疼是Acitvity的管理問題,因為在Android的系統(tǒng)中每一個用戶看到的界面都是由一個Activity來提供的,Activity的生存擁有自己的生存周期,一個Activity從它創(chuàng)建到結(jié)束需要經(jīng)歷onCreate,onResume,onPause,onStop,onDestory等階段,此過程中系統(tǒng)的開銷是不小的。在Android系統(tǒng)中,從一個Activity跳轉(zhuǎn)到另一個Activity后,對于前一個Activity中的很多資源系統(tǒng)不會及時地回收,前一個Activity只是被置于一種保持的狀態(tài)。用戶退出一個軟件后,Android系統(tǒng)不會把此軟件使用的所有內(nèi)存進行回收,這樣會造成系統(tǒng)資源的浪費。
對于這種情況,駕校通中使用了一個ActivityManager類來統(tǒng)一地管理所有的Activity,當有Activity打開的時候,ActivityManager會把此Activity添加到一個管理的隊列中進行管理,當再次打開同一個Activity的時候,ActivityManager會把上一個相同的Activity進行資源銷毀,在退出軟件的時候,ActivityManager會把管理隊列中所有的Activity逐一進行資源銷毀回收。系統(tǒng)可以通過ActivityManager中管理隊列中的Activity實例來進行某Activity資源的調(diào)用。這樣可以提高軟件的運行速度,同時也可以在軟件退出時提高系統(tǒng)資源回收的能力。
關(guān)鍵代碼如下:
public static void addActivity(Activity ac){
if(allActivitys.containsKey(ac.getLocalClassName())){
allActivitys.get(ac.getLocalClassName()).finish();
allActivitys.remove(ac.getLocalClassName());
}
allActivitys.put(ac.getLocalClassName(), ac);
}
public static void removeActivity(String key){
if(allActivitys.containsKey(key))
allActivitys.remove(key);
}
//循環(huán)遍歷所有的Activity實例進行資源銷毀
Iterator it=allActivitys.entrySet().iterator();
while (it.hasNext()) {
if(it==1){
continue;
}
Map.Entry entry=(Entry) it.next();
//通過調(diào)用Activity的finish()方法來釋放所有的Activity
Activity ac=(Activity)entry.getValue();
ac.finish();}
3 結(jié)束語
綜上所述,駕校通軟件在開發(fā)過程中,針對手持設(shè)備存儲容量有限、計算能力有限的特點,從四個方面進行了優(yōu)化處理:一是本地化試題庫數(shù)據(jù),即試題庫數(shù)據(jù)是內(nèi)置于安裝程序,安裝后即可使用,通過SQLite進行本地數(shù)據(jù)讀取可以提高軟件的運行效率。二是對于其它大量相關(guān)資料采取存儲在服務(wù)器上,開發(fā)者可以定時更新服務(wù)器上的數(shù)據(jù),供用戶通過網(wǎng)絡(luò)隨時下載到本地瀏覽。三是調(diào)用了百度的轉(zhuǎn)碼技術(shù)實現(xiàn)Web網(wǎng)頁到WAP網(wǎng)頁的轉(zhuǎn)換;四是使用ActivityManager類來統(tǒng)一管理所有的Activity,節(jié)省系統(tǒng)開銷。
參考文獻:
[1]百度公司.http://developer.baidu.com/.2012年.
[2]明日科技.Android從入門到精通[M].清華大學(xué)出版社,2012.
50-100.
[3](美)艾倫,(美)歐文斯著,楊謙,劉義宣,謝志強譯.SQLite權(quán)威指南(第二版)[M].北京:電子工業(yè)出版社.2012.24-200.
[4](美)達西,(美)康德爾 著,北京麥稈創(chuàng)智信息技術(shù)有限公司 譯. Android移動應(yīng)用開發(fā)(第3版)卷Ⅱ:提高篇[M].人民郵電出版社,2013.20~200.
[5]李興華.名師講壇——Android開發(fā)實戰(zhàn)經(jīng)典[M].清華大學(xué)出版社,2012.30-200.