官术网_书友最值得收藏!

1.2 歡迎界面

在每個應(yīng)用程序中歡迎界面都是必不可少的,它的主要作用是展示產(chǎn)品Logo、檢查程序完整性、檢查程序的版本更新、加載廣告頁、做一些初始化操作等。本節(jié)將針對歡迎界面開發(fā)進行詳細講解。

1.2.1 開發(fā)流程圖

在程序開發(fā)中,使用流程圖可以更好地分析程序開發(fā)流程。接下來展示一下歡迎界面的開發(fā)流程圖,具體如圖1-13所示。

從圖1-13可以看出,歡迎頁面需要獲取應(yīng)用程序的本地版本號,并與服務(wù)器中應(yīng)用程序版本比對,若版本號相同則進入主界面,若不相同則彈出版本升級對話框,讓用戶選擇是否更新應(yīng)用程序版本,如果選擇更新則下載安裝新版本APK文件,否則立即進入程序主界面。

圖1-13 歡迎界面開發(fā)流程圖

1.2.2 歡迎界面UI

在開發(fā)手機安全衛(wèi)士項目時,首先需要創(chuàng)建一個工程,將其命名為“手機安全衛(wèi)士”,將包名指定為“cn.itcast.mobliesafe”,然后創(chuàng)建第一個包cn.itcast.mobliesafe.chatper01。由于歡迎界面就是Splash界面,因此將要創(chuàng)建的Activity命名為“SplashActivity”,布局文件指定為“activity_splash.xml”,然后將歡迎界面的背景圖(launch_bg.jpg)導(dǎo)入到drawable-hdpi目錄中。歡迎界面的圖形化界面如圖1-14所示。

圖1-14 歡迎界面

圖1-14所示歡迎界面對應(yīng)的布局文件如【文件1-1】所示。

【文件1-1】activity_splash.xml

上述布局文件中,使用的是RelativeLayout布局,該布局中放置了一個ProgressBar控件和一個TextView控件,ProgressBar控件用于顯示程序加載的進度條,TextView控件用于顯示程序的版本號。

需要注意的是, TextView中有幾個特殊屬性用于指定文字陰影效果,其中android:shadowColor屬性用于指定陰影顏色, android:shadowDx 、 android:shadowDy 、android:shadowRadius屬性分別用于指定陰影在X軸和Y軸上的偏移量以及陰影的半徑。陰影的半徑必須設(shè)置,當數(shù)值為0時無陰影,數(shù)值越大時陰影會越透明,擴散效果越明顯。

1.2.3 服務(wù)器的搭建

由于本程序需要獲取服務(wù)端應(yīng)用的版本號以及下載服務(wù)器最新的APK,因此需要搭建一個服務(wù)器。搭建步驟如下:

(1)本程序使用Tomcat作為服務(wù)器,點擊Tomcat目錄下的bin/startup.bat開啟服務(wù)器。

(2)創(chuàng)建一個HTML頁面(updateinfo.html),該頁面返回的信息需要包括服務(wù)器中APK的版本號、版本說明以及新版本的下載地址。updateinfo.html頁面的JSON信息如下所示:

(3)將updateinfo.html頁面以及手機安全衛(wèi)士2.0的APK(經(jīng)過簽名打包用于發(fā)布的APK,而不是調(diào)試的APK)復(fù)制到Tomcat的webapps/ROOT文件夾下。

多學一招:JSON數(shù)據(jù)

JSON即JavaScript Object Notation(對象表示法),是一種輕量級的數(shù)據(jù)交換格式,它基于JavaScript的一個子集,使用了類似于C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數(shù)據(jù)交互語言,易于閱讀和編寫,同時也易于機器解析和生成。

與XML一樣,JSON也是基于純文本的數(shù)據(jù)格式,并且JSON的數(shù)據(jù)格式非常簡單,既可以用JSON傳輸一個簡單的String、Number、Boolean類型數(shù)據(jù),也可以傳輸一個數(shù)組,或者一個復(fù)雜的Object對象。

JSON有兩種結(jié)構(gòu),具體如下:

●值的有序列表:在大部分語言中,它被理解為數(shù)組(array)。

●“名稱/值”對的集合:在不同的語言中,它被理解為對象、記錄、結(jié)構(gòu)、字典、哈希表等。

這些都是常見的數(shù)據(jù)結(jié)構(gòu),事實上大部分現(xiàn)代計算機語言都以某種形式支持它們。這使得一種數(shù)據(jù)格式在不同的編程語言之間交互成為可能。

使用JSON表示數(shù)組時,數(shù)組以“[”開始,以“]”結(jié)束,每個元素之間使用“,”(逗號)分隔(元素可以是任意的Value)。其存儲形式如圖1-15所示。

圖1-15 存儲數(shù)組

例如,一個數(shù)組包含了String、Number、Boolean、null類型數(shù)據(jù),JSON的表示形式如下:

["abc",12345,false,null]

使用JSON表示Object類型數(shù)據(jù)時,Object對象以“{”開始,以“}”結(jié)束,每個“名稱”后跟一個“:”(冒號);“名稱/值”對之間使用“,”(逗號)分隔。其存儲形式如圖1-16所示。

圖1-16 存儲對象

例如,一個address對象包含城市、街道、郵編等信息,JSON的表示形式如下:

{"city":"Beijing","street":"Chaoyang Road","postcode":100025 }

當使用JSON存儲Object時,其中的Value既可以是一個Object,也可以是數(shù)組,因此,復(fù)雜的Object可以嵌套表示。例如,一個Person對象包含name和address對象,其表示格式如下:

假設(shè)Value值是一個數(shù)組,例如,一個Person對象包含name和hobby信息,其表示格式如下:

需要注意的是,如果使用JSON存儲單個數(shù)據(jù)(如“abc”),一定要使用數(shù)組的形式,不要使用Object形式,因為Object形式必須是“名稱/值”的形式。

1.2.4 下載和安裝APK

1.下載APK

本項目采用第三方開源框架xUtils下載APK,因此需要將xUtils的jar包復(fù)制到工程libs目錄下,選中xUtils工具包并右擊,選擇Build Path→Add to Build Path命令將jar包導(dǎo)入工程。

xUtils是Android的第三方開源框架,它起源于Afinal框架(用于發(fā)送HTTP請求、顯示Bitmap圖片等),同時xUtils包含了很多實用的Android工具類。接下來介紹一下本項目用到xUtils的幾個類和方法,具體如下所示:

(1)HttpUtils類用于發(fā)送HTTP請求、上傳文件、下載文件等,其中HttpUtils的download(String url,String target,RequestCallBack<File> requestCallBack)方法是用來下載文件的。參數(shù)url代表要下載文件的路徑,target代表下載文件的本地路徑,requestCallBack是一個接口對象用于監(jiān)聽文件下載狀態(tài)的。

(2)RequestCallBack<File>接口有三個抽象方法,分別在下載成功、下載失敗、下載中調(diào)用,通過這三個抽象方法可以獲取到文件的下載狀態(tài)。

在cn.itcast.mobliesafe.chapter01中創(chuàng)建utils包,用于存放下載文件的工具類DownLoadUtils.java,具體代碼如【文件1-2】所示。

【文件1-2】DownLoadUtils.java

代碼說明:

●第8~27行的downapk()方法用于下載APK,在該方法中創(chuàng)建HttpUtils對象,然后調(diào)用它指定的下載方法download(),在調(diào)用該方法時,需要實現(xiàn)RequestCallBack<File>接口中的三個抽象方法。

●第31~38行的MyCallBack回調(diào)接口用于監(jiān)聽文件的下載狀態(tài),它的作用與Resquest CallBack的作用一致。

多學一招:回調(diào)函數(shù)

在學習Android過程中,經(jīng)常會遇到“回調(diào)函數(shù)”這個詞,那么什么是回調(diào)函數(shù)呢?簡單地說,回調(diào)函數(shù)就是通過其指針來調(diào)用的函數(shù),它不會被自己所在的對象調(diào)用,只會在調(diào)用別人的方法的時候反過來被調(diào)用。大家都知道,Android程序是通過Java語言來實現(xiàn)的,Java中是沒有指針的,因此在實現(xiàn)回調(diào)時都是通過接口或抽象類。

回調(diào)的過程簡單理解為,在A類中定義了一個方法,這個方法中用到了一個接口和該接口中的抽象方法,但是抽象方法沒有具體的實現(xiàn),需要B類去實現(xiàn)。當B類實現(xiàn)該方法后,它本身不會去調(diào)用該方法,而是傳遞給A類,供A類去調(diào)用。這種機制就稱為回調(diào)。

回調(diào)機制是將實現(xiàn)功能和定義分離的一種手段,是一種松耦合的設(shè)計思想。接下來通過一段代碼進行分析,具體如下:

(1)定義回調(diào)接口ICallBack

(2)定義一個實現(xiàn)類FooBar

在上述代碼中,第一段代碼定義了一個回調(diào)接口ICallBack,該接口中有一個postExec()方法,但是并沒有實現(xiàn)。第二段代碼定義了一個FooBar類,該類中有一個setCallBack()方法,接收一個ICallBack參數(shù),然后在doSth()方法中通過callBack.postExec()實現(xiàn)postExec()方法,最后在main()方法中進行調(diào)用。這就是一個回調(diào)函數(shù)的基本用法。

在Android開發(fā)中,回調(diào)函數(shù)使用非常廣泛,下面列舉兩個回調(diào)函數(shù)的使用場景,讓大家更直觀地看到回調(diào)函數(shù)是如何應(yīng)用的。

應(yīng)用場景一:事件監(jiān)聽器的回調(diào)

上面的代碼給按鈕加了一個事件監(jiān)聽器,自己不會顯式地去調(diào)用onClick()方法。用戶觸發(fā)了該按鈕的點擊事件后,它會由Android系統(tǒng)來自動調(diào)用。

應(yīng)用場景二:Activity生命周期中的回調(diào)

上面的代碼是創(chuàng)建Activity時,系統(tǒng)自帶的onCreate()方法,該方法不會被人為調(diào)用,但是它會在Android系統(tǒng)進行自動調(diào)用。

2.獲取版本號和安裝APK

在下載APK之前首先要獲取到程序的本地版本號,當本地版本號與服務(wù)器版本號不一致時,彈出更新提醒對話框,進行下載安裝。由于這部分代碼功能比較獨立,且在其他程序中也可以使用,因此將其抽取出來作為工具類MyUtils,具體代碼如【文件1-3】所示。

【文件1-3】MyUtils.java

代碼說明:

●第7~19行的getVersion()方法用于獲取本地版本號,首先要獲取到PackageManger對象,然后調(diào)用getPackageInfo()方法獲取到PackageInfo對象,通過PackageInfo對象即可獲取到本地版本號。

●第24~33行的installApk()方法利用了隱式意圖開啟了系統(tǒng)中用于安裝APK的Activity。

1.2.5 版本更新工具類

通過前面的講解可知,歡迎界面需要獲取服務(wù)器中程序的版本號,【實現(xiàn)版本號比對】→【彈出更新提醒對話框】→【彈出下載APK進度條】→【替換安裝程序】等。由于這個邏輯是一個整體,因此將這塊代碼抽取出來放在工具類VersionUpdateUtils中,具體代碼如【文件1-4】所示。

【文件1-4】VersionUpdateUtils.java

代碼說明:

●第9~34行的Handler代碼用于線程間通信,及時通知主線程更新UI,并進入主界面。

●第47~85行的getCloudVersion()方法用于訪問網(wǎng)絡(luò)獲取服務(wù)器版本號,首先創(chuàng)建一個HttpClient對象,然后通過HttpConnectionParams設(shè)置鏈接超時時間和請求超時時間,并通過HttpGet請求updateinfo.html頁面,解析該頁面的JSON數(shù)據(jù),與本地版本號進行比對,如果不一致則使用Handler發(fā)送消息。

●第90~117行的showUpdateDialog方法用于彈出升級對話框,當點擊“暫不升級”按鈕時,會進入主界面,當點擊“立即升級”時,會初始化下載對話框調(diào)用下載APK的方法。

●第130~155行的downloadNewApk()方法用于下載APK,在該方法中調(diào)用了DownLoadUtils.downapk()方法。當APK下載完成后,調(diào)用了MyUtils.installApk()方法進行安裝。

上述代碼是一個完整的下載更新流程,因此只需要在Activity中創(chuàng)建VersionUpdateUtils實例,并在子線程中調(diào)用getCloudVersion()方法即可。

1.2.6 版本信息的實體類

由于從服務(wù)器中獲取的程序版本號、版本描述、下載地址需要存儲到實體類中,因此需要定義一個實體類VersionEntity,具體代碼如【文件1-5】所示。

【文件1-5】VersionEntity.java

1.2.7 歡迎界面邏輯

創(chuàng)建好一系列的工具類和實體類之后,接下來需要在SplashActivity中調(diào)用相應(yīng)的代碼,在歡迎頁面中實現(xiàn)版本更新操作,具體代碼如【文件1-6】所示。

【文件1-6】SplashActivity.java

代碼說明:

●第12行代碼通過MyUtils類中的getVersion()方法獲取到應(yīng)用的本地版本號。

●第14~21行代碼創(chuàng)建VersionUpdateUtils對象并開啟子線程用于獲取服務(wù)器端程序版本號。

●第24~27行initView()方法用于將獲取到的本地版本號顯示在界面上。

由于本程序需要請求網(wǎng)絡(luò)下載APK到手機內(nèi)存卡,因此需要在AndroidManifest.xml文件中添加訪問網(wǎng)絡(luò)和寫SD卡的權(quán)限,具體代碼如下所示:

主站蜘蛛池模板: 怀安县| 沙雅县| 河西区| 柞水县| 通州市| 六枝特区| 汝南县| 通渭县| 佳木斯市| 崇左市| 手游| 容城县| 巩义市| 大姚县| 江华| 侯马市| 乌拉特后旗| 扎兰屯市| 明水县| 宜兴市| 灯塔市| 庄河市| 华池县| 西林县| 凤阳县| 平遥县| 河北区| 梧州市| 蒙城县| 土默特左旗| 唐山市| 兴安县| 蕉岭县| 济源市| 岐山县| 新蔡县| 桃园市| 富民县| 邢台县| 府谷县| 凉城县|