編輯:Android開發實例
引言
隨著 3G 時代的到來,移動互聯網的發展,手機的功能越來越強大,手機裡的數據對每個用戶來說都非常的重要,特別是通訊錄、日程、短信息、郵件等數據,一旦手機丟失、誤刪或其他意外使得數據無法正常使用,會給用戶帶來麻煩,數據備份與恢復這個應用可以幫助用戶解決這個問題。
本文主要論述了基於 Android 平台所提供的開發框架和應用組件,並給出了一種數據備份恢復的設計與實現。
背景知識介紹
當前流行的智能手機操作系統有 Windows Mobile,Symbian,iPhone OS,Android 等。本文基於目前最熱門的 Android 系統平台,該平台具有開源、易用、開發方便、與個人電腦有較強的融合性等眾多優勢。
Android 架構
圖 1. Android 架構圖
Application:
Android 會與一個核心應用程序包一起發布,如通訊錄、短信息、浏覽器等,所有的應用使用 Java 語言所開發。
Application Framework:
Android 應用程序框架對於開發者也完全可以訪問核心應用程序所使用的 API 框架。該應用程序架構用來簡化組件軟件的重用;任何一個應用程序都可以發布它的功能塊並且任何其它的應用程序都可以使用其所發布的功能塊。該應用程序重用機制使得組建可以被用戶替換。
Libraries:
Android 程序庫包括一個被 Android 系統中各種不同組件所使用的 C/C++ 庫集。該庫通過 Android 應用程序框架為開發者提供服務。
Linux Kernel:
內核 Android 的核心系統服務依賴於 Linux 2.6 內核,如安全性,內存管理,進程管理,網絡協議棧和驅動模型。 Linux 內核也同時作為硬件和軟件堆棧之間的硬件抽象層。
備份恢復的設計與實現
備份的方式有本地備份、網絡備份,本地備份是直接將數據備份到 SDcard 存儲介質中;網絡備份是將數據備份到網絡服務器中。網絡服務器系統是基於 J2EE 架構,通過 HTTP(HTTPS)協議對終端提供服務,備份的應用的數目可以大於等於 1,這裡只備份通訊錄。系統體系結構圖如下所示:
圖 2. 數據備份與恢復體系結構圖
本地備份恢復
本地備份恢復客戶端的流程
用戶選擇本地 Backup 或 Restore,通過向 Contacts 發送廣播信號,如果 Contacts 准確收到廣播信號後,開始執行 Backup 或 Restore 操作,完成後反饋操作結果。流程圖如下所示:
圖 3. 本地備份恢復流程圖
本地備份恢復客戶端的序列圖:
在序列圖中,客戶端選擇本地備份或本地恢復後,發送廣播消息通知 Contacts 應用開始備份或恢復 (ContactsReceiver 根據信號類別 : 執行備份或恢復操作 ),通過 FileInputStream 和 FileOutputStream 對數據庫文件進行 read/write。
如果是本地備份則將自身的數據庫文件寫到 SDCard;如果是本地恢復將 SDCard 中對應的文件寫到 Contacts 應用對應的路徑下,用以覆蓋原始數據庫文件。
用 Environment.getExternalStorageDirectory() 方法獲取 SD 卡的路徑 , 卡存儲空間大小及已占用空間獲取方法 :
/* 獲取存儲卡路徑 */ File sdcardDir=Environment.getExternalStorageDirectory(); /*StatFs 看文件系統空間使用情況 */ StatFs statFs=new StatFs(sdcardDir.getPath()); /*Block 的 size*/ Long blockSize=statFs.getBlockSize(); /* 總 Block 數量 */ Long totalBlocks=statFs.getBlockCount(); /* 已使用的 Block 數量 */ Long availableBlocks=statFs.getAvailableBlocks();
序列圖如下所示:
圖 4. 本地備份恢復序列圖
本地備份恢復客戶端的實現:
如下圖給出了 BackupRestoreActivity 和 ContactsReceiver 的類圖,以及他們工作機制中涉及到的類的結構。
圖 5. 本地備份恢復類圖
commandFilter = newIntentFilter(); commandFilter.addAction("signal"); registerReceiver(BroadcastReceiver, commandFilter); BroadcastReceiver 用來接收和響應廣播消息
用戶選擇本地備份或者本地恢復,ContactsReceiver 則收到廣播消息後,根據信號判斷操作的類別是備份還是恢復,然後啟動一個線程,在線程中調用 Handler,通過 Handler 去處理讀寫數據。
網絡備份恢復
服務器端設計與實現
網絡備份通過 WiFi 或者 GPRS 在手機端與服務器進行連接,服務器提供相應的接口,用於上傳或下載文件。
服務器端用例分析
1) 備份數據上傳:響應客戶端的 backup 功能。文件通過 HTTP 請求提交到服務器,服務器接收文件並保存,序列圖表示如下:
圖 6. 網絡備份恢復上傳序列圖
說明:如果 Servlet 檢查到輸入參數不合法,會中斷服務並通知客戶端。
接口定義:
URL:https://<server>:<port>/upload?uuid=< 上傳文件的 uuid>&name=< 真實文件名 >&md5= 8b1a9fbf5e111296a827abf8c47804d7&offset=< 偏移量 >&desc=< 文件描述信息 >&size=< 文件大小 >&deviceid=< 終端的 id>,HTTP 正文為上傳的內容
表 1. 備份數據上傳參數表
必須使用 POST 方式提交,且只允許上傳一個文件
offset:客戶端應從 offset( 包含 offset) 開始上傳文件。offset=0 時,忽略 offset 參數。
如果是續傳文件,應先用 uploadquery 接口查詢文件已上傳部分的大小,以獲取 offset 的值
表 2. 備份數據上傳返回值
成功
失敗(包含公共錯誤)
2) 備份數據下載:響應客戶端的網絡恢復功能。根據文件名將用戶請求的文件傳遞給客戶端。序列圖表示如下:
圖 7. 網絡備份恢復下載序列圖
流程描述如下:
接口定義:
URL:https://<server>:<port>/fileDownload? uuid=< 文件標識 >&range=< 偏移量 > &deviceid=< 終端的 id>
參數含義同備份數據上傳;客戶端應從 range ( 包含 range) 開始下載,range =0 時,忽略 range 參數。
表 3. 備份數據下載返回值:
成功
失敗
3) 新建手機備份存儲空間:當客戶端第一次訪問備份服務器時,系統會返回找不到個人網絡備份存儲空間錯誤,客戶端軟件提示用戶是否新建備份空間,用戶確認建立個人網絡備份空間,系統才會為其建立存儲空間。服務器會用 deviceid 為標識為對應的手機的分配固定大小的空間。服務器端使用 adapter 模式來連接多種不同文件存儲媒體。序列圖表示如下:
圖 8. 網絡備份恢復創建存儲空間序列圖
接口定義:
URL:https://<server>:<port>/createspace?deviceid=< 終端的 id>
參數含義同備份數據上傳。
表 4. 創建存儲空間返回值:
成功
失敗
4) 查詢已上傳部分的大小:當文件上傳中斷時,可以查詢已上傳部分的大小,然後斷點續傳余下部分。序列圖表示如下:
圖 9. 網絡備份恢復查詢已上傳部分序列圖
接口定義:
URL:https://<server>:<port>/uploadquery?uuid=< 上傳文件的 uuid>&deviceid=< 終端的 id>
參數含義同備份數據上傳。
表 5. 查詢文件已上傳部分返回值:
成功
失敗(包含公共錯誤)
服務器端的實現:
1) 包文件設計如下所示:
圖 10. 網絡備份恢復包文件設計圖
DAO 接口,DAO 主要用來解偶業務方法和數據源,即在業務核心方法和具體數據源之間再增加一層,用來連接業務方法和數據源。
在 spring 的配置文件:applicationContext.xml 中,該文件中定義了 Spring 要管理的所有的 Beans, 用 Beans 的形式來管理所有的對象以及他們之間的賦值依賴的。在此配置文件中主要定義了 dao,model,service 下面的類。示例代碼如下:
清單 1. spring 的配置文件
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:com/bakrestore/server/dao/ibatis/sql/sql-map-config.xml" /> <property name="dataSource" ref="dataSource" /> <property name="lobHandler" ref="lobHandler" /> </bean> <bean id="userSpaceDAO" class="com.bakrestore.server.dao.ibatis.UserSpaceDAOImpl"> <property name="sqlMapClient" ref="sqlMapClient"/> </bean> <bean id="userFileDAO" class="com.bakrestore.server.dao.ibatis.UserFileDAOImpl"> <property name="sqlMapClient" ref="sqlMapClient"/> </bean> <bean id="adddbdao" class="com.bakrestore.server.dao.ibatis.AddDbDAOImpl"> <property name="sqlMapClient" ref="sqlMapClient"/> </bean> <bean id="addDbService" class="com.bakrestore.server.service.impl.AddDbServiceImpl"> <property name="adddbdao" ref="adddbdao"/> <property name="fileContentService" ref="fileContentService" /> </bean> <bean id="fileService" class="com.bakrestore.server.service.impl.FileServiceImpl"> <property name="userSpaceDAO" ref="userSpaceDAO"/> <property name="userFileDAO" ref="userFileDAO"/> <property name="fileContentService" ref="fileContentService" /> </bean> <bean id="spaceService" class="com.bakrestore.server.service.impl.SpaceServiceImpl"> <property name="userSpaceDAO" ref="userSpaceDAO"/> <property name="fileContentService" ref="fileContentService" /> <property name="spaceMaxSize" value="${UserSpaceMaxSize}" /> </bean>
在 SpringDispatcher-servlet.xml 配置一個視圖解析器,其次將手機端的請求與相應的進行映射.以便程序在執行過程中可以依據映射找到所需 Controller,相應的 Controller 與 applicationContext.xml 所定義的 beans 進行交互。示例代碼如下:
清單 2. 配置一個視圖解析器
<bean id="createspace" name="/createspace" parent="pim" class="com.bakrestore.server.web.CreateSpaceController"> </bean> <bean id="download" name="/download" parent="pim" class="com.bakrestore.server.web.DownloadController" > </bean> <bean id="uploadquery" name="/uploadquery" parent="pim" class="com.bakrestore.server.web.UploadQueryController"> </bean> <bean id="upload" name="/upload" parent="pim" class="com.bakrestore.server.web.UploadController" > <property name="sizeMax" value="${UploadFileSizeMax}" /> <property name="uploadFileTempFolder" value="${UploadFileTempFolder}" /> </bean>
2) 持久化類設計如下所示:
在 com.bakrestore.server.model 文件夾中包含 FileNode, FolderNode,UserFile,DatabaseFileContent,FileSystemFileContent,UserFileContent,UserSpace 的一些類 , 他們的作用是:
用數據庫存儲文件內容的文件內容實體類
實體類
類圖以及他們工作機制如下所示:
圖 11. 網絡備份恢復持久化類設計圖
3) 應用類 :
應用類主要用來響應手機發出的 HTTP 請求信號,在 com.bakrestore.server.web 文件夾主要包含 CreateSpaceController,DownloadController,ErrorCode,BaseController,RequestParamater,UploadController,UploadQueryController 等一些控制器,他們的作用分別是:
以下是他們之間的工作機制:
圖 12. 網絡備份恢復應用類設計圖
4) DAO 類
在 dao 文件夾包含 PbsDataAccessException,UserFileContentDAO,UserFileDAO,
UserSpaceDAO 四個 interface,他們的作用分別是:
以下是他們之間的工作機制:
圖 13. 網絡備份恢復 DAO 類設計圖
5) 業務邏輯類
在 service 文件夾包含 FileContentService,FileService,SpaceService 三個 interface,他們的作用分別是:
以下是他們之間的工作機制:
圖 14. 網絡備份恢復業務邏輯類設計圖
6) 數據庫層設計
數據庫層設計及相互關系表示如下:
圖 15. 數據庫關系圖
表 6. 用戶存儲空間表 UserSpace
網絡備份與恢復客戶端設計與實現
1) 網絡備份恢復客戶端的流程
網絡備份恢復客戶端流程圖與圖 3 類似,所不同的是用戶選擇網絡 Backup 或 Restore,讓後向 Contacts 發送廣播信號,如果 Contacts 准確收到廣播信號後,開始執行 Backup 或 Restore 操作,完成後反饋操作結果。
2) 網絡備份恢復客戶端的序列圖:
在序列圖中,客戶端選擇網絡備份或恢復後,發送廣播消息通知 Contacts 應用開始備份或恢復 (ContactsReceiver 根據信號類別 : 備份 / 恢復進行操作 ),如果是網絡備份則將自身的數據庫文件上傳到網絡備份服務器;如果是網絡恢復將網絡服務器中用戶對應的文件寫到 Contacts 應用對應的路徑下,用以覆蓋原始數據庫文件。
圖 16. 網絡備份恢復客戶端時序圖
3) 網絡備份與恢復客戶端的實現
網絡備份與恢復客戶端的實現部分見圖 5。用戶選擇網絡備份或網絡恢復,ContactsReceiver 則收到廣播消息後,根據信號判斷操作的類別是備份還是恢復,然後啟動一個線程,在線程中調用 Handler,在 Handler 調用服務端接口,操作完成後根據返回的 HTTP 頭信息,如果等於 200 提示用戶操作成功;如果大於 200,根據 Code 中的 MSG 轉態碼 ( 見表 2,3,4,5) 提示相應的失敗信息。
回頁首
總結與展望
數據備份恢復的設計與實現,詳細講解了一種備份恢復通訊錄中數據庫文件的方法,存儲方式有兩種,一種是直接存儲在本地,另一種是通過與服務器的交互,存儲在網絡服務器中;備份到 SDcard 或網絡服務器中的通訊錄文件,由於每次備份時都會自動創建一個以日期時間命名的文件夾,所以可以備份 n 次而不會覆蓋。
但是這些還不夠完善。從廣度來說,如果能做到隨意添加需要備份的 android 應用;如果數據能以 VCARD 格式存儲,以方便將數據導出到 PC 中;如果能管理已備份的文件,比如更改備份文件名稱、刪除已備份文件等。從深度來說如果能實現數據的增量備份,可以有效改善由於存儲容量有限所帶來的問題;如果能通過加密解密實現網絡備份數據共享,從而實現不同手機之間下載數據,例如日程應用在對方允許的情況下獲知對方密匙後,下載另一用戶的日程,這樣就可以更加方便的了解對方,那功能將會更完善。
移動互聯網是一個剛剛興起的市場,越來越多的公司和開發人員把 PC 時代的互聯網產品引入到手持設備上來。嵌入式硬件性能的不斷提升,以及軟件平台的層出不窮,更是為這個新領域的發展奠定了基礎。Android 系統就是在這樣的條件下出現的,它完全開源免費,允許生產商隨意定制自己的操作系統和軟件商店,搭建自己的平台,將每個公司自己的交互理念推向用戶,力求用極致的用戶體驗來搶占市場。雲計算是當下很流行的一種服務模式,該模式在移動互聯網領域將會有很大的發展,因為它徹底解放了手持設備,讓手持設備的資源有限、電量有限等特點不再成為阻礙其發展的短板。作者認為 Android 系統將會在移動互聯網有比較廣泛的應用。
參考資料
學習
討論
作者簡介
黃勇,中國科學技術大學,碩士研究生;現於 IBM CDL Filenet eForms Team 從事自動化測試相關工作。
孫健,IBM 軟件工程師,負責 FileNet eforms 功能測試工作。
一、問題描述 LBS位置服務是android應用中重要的功能,應用越來越廣泛,下面我們逐步學習和實現lbs相關的應用如定位、地圖、導航等,首先我們看如何基於百度地
在Android 5.0之後引入了MD風格,從而狀態欄沉浸也成為了一種設計習慣。而停留在之Andr
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
本文實例講述了android編程實現懸浮窗體的方法。分享給大家供大家參考,具體如下: 突然對懸浮窗體感興趣,查資料做了個小Demo,效果是點擊按鈕後,關閉當前Ac