Android系統(tǒng)設(shè)計(jì)與開發(fā)PPT完整全套教學(xué)課件_第1頁
Android系統(tǒng)設(shè)計(jì)與開發(fā)PPT完整全套教學(xué)課件_第2頁
Android系統(tǒng)設(shè)計(jì)與開發(fā)PPT完整全套教學(xué)課件_第3頁
Android系統(tǒng)設(shè)計(jì)與開發(fā)PPT完整全套教學(xué)課件_第4頁
Android系統(tǒng)設(shè)計(jì)與開發(fā)PPT完整全套教學(xué)課件_第5頁
已閱讀5頁,還剩726頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

目錄第1章Android系統(tǒng)導(dǎo)論第2章Java基礎(chǔ)第3章Android工程結(jié)構(gòu)第4章Activity第5章Android應(yīng)用界面第6章Android的廣播機(jī)制第7章Android服務(wù)第8章數(shù)據(jù)存儲與共享第9章位置服務(wù)第10章網(wǎng)絡(luò)編程第11章多媒體開發(fā)第12章AndroidNDK編程第13章高級UI-MaterialDesign簡介全套PPT課件第1章Android系統(tǒng)導(dǎo)論1.1Android系統(tǒng)概述1.2Android系統(tǒng)架構(gòu)1.3Android開發(fā)環(huán)境搭建本章總結(jié)

1.1Android系統(tǒng)概述

1.1.1Android系統(tǒng)的發(fā)展歷程Android系統(tǒng)最開始的2個(gè)版本都是以著名的機(jī)器人名稱來命名的,它們分別是阿童木(AndroidBeta)和發(fā)條機(jī)器人(Android1.0)。后來谷歌公司(Google

Inc.)將其命名規(guī)則改為用甜點(diǎn)作為系統(tǒng)版本代號。

1.1.2Android系統(tǒng)的特點(diǎn)

Android系統(tǒng)的特點(diǎn)如下:

1.四大組件

Android系統(tǒng)的四大組件分別為Activity(活動)、Service(服務(wù))、BroadcastReceiver(廣播接收者)和ContentProvider(內(nèi)容提供者)。其中Activity是所有Android程序展示內(nèi)容的窗口,用戶平時(shí)在操作Android手機(jī)時(shí)能看到的內(nèi)容都要放在Activity中。Service與Activity相反,它在后臺運(yùn)行,為用戶提供相關(guān)服務(wù),比如用戶在操作其他應(yīng)用程序的時(shí)候也可以聽音樂。

BroadcastReceiver能夠讓應(yīng)用程序接收來自其他地方的廣播消息,比如短信等;應(yīng)用程序也可以通過BroadcastReceiver向其他地方發(fā)出廣播消息。ContentProvider用于實(shí)現(xiàn)應(yīng)用程序之間的數(shù)據(jù)共享,比如用戶在使用一款聊天軟件時(shí),通過它能夠調(diào)用系統(tǒng)通訊錄中聯(lián)系人的信息。

2.豐富的UI界面

Android系統(tǒng)為開發(fā)者提供了豐富的系統(tǒng)控件,比如按鈕、文本框等,這樣可以加快界面的開發(fā)速度。

3.內(nèi)置數(shù)據(jù)存儲功能

Android系統(tǒng)支持高效的、快速的存儲方式,并內(nèi)置了輕量級、運(yùn)算速度較快的嵌入式關(guān)系型數(shù)據(jù)庫SQLite,不僅支持標(biāo)準(zhǔn)的SQL語法,還可以通過Android封裝好的API進(jìn)行操作,便于存儲和讀取數(shù)據(jù)。

4.豐富的多媒體功能

Android系統(tǒng)提供了豐富的多媒體功能,如拍視頻、拍照、錄音等,可以使Android應(yīng)用程序變得豐富多彩。

5.完善的位置服務(wù)

Android系統(tǒng)支持位置服務(wù)和地圖應(yīng)用,開發(fā)者可以通過位置服務(wù)和地圖相關(guān)API進(jìn)行開發(fā),輕松地實(shí)現(xiàn)定位獲取、軌跡路線獲取、地理信息可視化等功能。

6.支持使用本地代碼開發(fā)

Android系統(tǒng)支持使用本地代碼(C或C++代碼)開發(fā)應(yīng)用程序,既提高了程序的運(yùn)行效率,又有助于增加Android開發(fā)的靈活性。

1.2Android系統(tǒng)架構(gòu)

Android系統(tǒng)架構(gòu)大致可分為5層,即Linux內(nèi)核層、硬件抽象層、系統(tǒng)運(yùn)行庫層、應(yīng)用程序框架層和應(yīng)用層,如圖1.1所示。

圖1.1Android系統(tǒng)架構(gòu)

1.?Linux內(nèi)核層

Android系統(tǒng)是基于Linux內(nèi)核的,但并沒有完全照搬Linux系統(tǒng)的內(nèi)核,它增加了Gold-Fish平臺以及Yaffs2Flash文件系統(tǒng),同時(shí)還對驅(qū)動程序進(jìn)行了增強(qiáng),增加了一些面向移動計(jì)算的特有功能,包括電源管理(PowerManagement)、低內(nèi)存管理器(LowMemoryKeller)、匿名共享內(nèi)存(Ashmem)、日志(AndroidLogger)、定時(shí)器(AndroidAlarm)、物理內(nèi)存映射管理(AndroidPMEM)、Android定時(shí)設(shè)備(AndroidTimedDevice)、AndroidParanoid網(wǎng)絡(luò)等。

2.硬件抽象層

Android系統(tǒng)硬件抽象層(HardwareAbstractLayer,HAL)對硬件設(shè)備的具體實(shí)現(xiàn)加以抽象,是連接Android應(yīng)用程序框架與內(nèi)核設(shè)備驅(qū)動的重要橋梁。其主要設(shè)計(jì)意圖是向下屏蔽底層設(shè)備以及驅(qū)動的實(shí)現(xiàn)細(xì)節(jié),保護(hù)廠商的商業(yè)秘密,向上為系統(tǒng)服務(wù)以及為應(yīng)用程序框架提供統(tǒng)一的設(shè)備訪問接口。

3.系統(tǒng)運(yùn)行庫層

系統(tǒng)運(yùn)行庫層是應(yīng)用程序框架的支撐,為Android系統(tǒng)中的各個(gè)組件提供服務(wù)。系統(tǒng)運(yùn)行庫層由系統(tǒng)類庫和Android運(yùn)行時(shí)構(gòu)成。

4.應(yīng)用程序框架層

應(yīng)用程序框架層提供開發(fā)Android應(yīng)用程序所需的一系列類庫,使開發(fā)人員可以進(jìn)行快速的應(yīng)用程序開發(fā),方便重用組件,也可以通過繼承實(shí)現(xiàn)個(gè)性化的擴(kuò)展。應(yīng)用程序框架層具體包括的模塊有Activity管理器(ActivityManager)、窗口管理器(WindowManager)、內(nèi)容提供器(ContentProvider)、視圖系統(tǒng)(ViewSystem)、通知管理器(NotificationManager)、包管理器(PackageManager)、資源管理器(ResourceManager)、位置管理器(LocationManager)、電話管理器(TelephonyManager)、XMPP服務(wù)等。

5.應(yīng)用層

應(yīng)用層包括各類與用戶直接交互的應(yīng)用程序,或由Java語言編寫的運(yùn)行于后臺的服務(wù)程序,如智能手機(jī)上常見的基本功能程序(SMS短信、電話撥號、圖片瀏覽器、日歷、游戲、地圖、Web瀏覽器等程序)以及開發(fā)人員開發(fā)的其他應(yīng)用程序。

1.3Android開發(fā)環(huán)境搭建

1.3.1開發(fā)工具AndroidSDK(AndroidSoftwareDevelopmentKit)即Android軟件開發(fā)工具包,是為Android開發(fā)者打造的軟件包、軟件框架、硬件平臺、操作平臺等應(yīng)用軟件的集合。使用AndroidSDK進(jìn)行Android開發(fā),可以大大提高開發(fā)效率。而Android開發(fā)如果通過Java語言實(shí)現(xiàn)還需要用到JDK(JavaDevelopmentKit),即Java軟件工具開發(fā)包。JDK中包含了Java的運(yùn)行環(huán)境、工具集合以及一些基本的類庫等內(nèi)容。

1.3.2搭建Android開發(fā)環(huán)境

搭建Android開發(fā)環(huán)境的步驟如下:

1.下載AndroidStudio

在瀏覽器中輸入谷歌公司官網(wǎng)的下載地址“/studio”,打開如圖1.2所示的界面,點(diǎn)擊DOWNLOADANDROIDSTUDIO按鈕即可下載AndroidStudio安裝包。

圖1.2AndroidStudio官網(wǎng)下載界面

2.安裝AndroidStudio

(1)選擇要安裝的組件。如圖1.3所示,這里我們需要勾選AndroidVirtualDevice復(fù)選框,它是Android虛擬設(shè)備,可以在Windows上運(yùn)行,其功能與真的Android設(shè)備的功能基本一致,在開發(fā)時(shí)可調(diào)試代碼、測試結(jié)果等。

(2)選擇AndroidStudio的安裝位置。如圖1.4所示,默認(rèn)安裝位置是C盤,也可以根據(jù)實(shí)際情況選擇安裝位置。

圖1.4選擇安裝位置

(3)點(diǎn)擊Next按鈕直到安裝完成。安裝完成后打開AndroidStudio,在第一次打開時(shí)會出現(xiàn)如圖1.5所示的提示界面,選擇是否導(dǎo)入以前的AndroidStudio版本配置。如果是首次安裝,可以選擇“Donotimportsettings”。點(diǎn)擊“OK”按鈕后會出現(xiàn)如圖1.6所示的警告對話框,這是因?yàn)闊o法訪問AndroidSDK中的add-onlist而出現(xiàn)的,詢問我們是否配置代理。直接選擇“Cancel”即可,不影響環(huán)境搭建。圖1.5導(dǎo)入配置界面

圖1.6警告對話框

3.配置AndroidStudio

(1)選擇安裝類型。AndroidStudio的安裝類型界面如圖1.7所示,點(diǎn)擊“Next”按鈕后,會出現(xiàn)如圖1.8所示的對話框,可以選擇需要的安裝類型。安裝類型有Standard和Custom兩種:Standard表示使用默認(rèn)安裝;Custom是根據(jù)用戶自身需求進(jìn)行自定義安裝。一般選擇Standard類型即可。圖1.7AndroidStudio的安裝類型界面

圖1.8選擇安裝類型

(2)選擇UI界面主題。點(diǎn)擊“Next”按鈕后會出現(xiàn)選擇AndroidStudioUI界面主題,如圖1.9所示。UI界面主題有Darcula深色和Light淺色兩種,用戶可以根據(jù)自己的喜好選擇主題。點(diǎn)擊“Next”按鈕,出現(xiàn)如圖1.10所示的配置頁面,這里顯示了SDK存放文件夾的位置。由于是首次安裝,之前沒有SDK,因此在點(diǎn)擊“Finish”后會自動下載安裝AndroidSDK。圖1.9選擇UI界面主題

圖1.10完成AndroidStudio的配置

所有的配置完成后,會出現(xiàn)AndroidStudio的歡迎界面,如圖1.11所示。至此,Android開發(fā)環(huán)境全部搭建完成。圖1.11AndroidStudio歡迎界面

1.3.3Android開發(fā)環(huán)境測試

為了驗(yàn)證Android開發(fā)環(huán)境是否搭建成功,我們可以創(chuàng)建一個(gè)工程來測試。在歡迎界面中選擇“StartanewAndroidStudioproject”,進(jìn)入如圖1.12所示界面,這里可以選擇要創(chuàng)建工程的類型,對于Android手機(jī)和平板(PhoneandTablet)來說,AndroidStudio提供了很多種內(nèi)置的模板供選擇,這里直接選擇“EmptyActivity”即可。

圖1.12選擇創(chuàng)建的工程類型

點(diǎn)擊“Next”按鈕之后,會出現(xiàn)工程配置的界面,如圖1.13所示。圖1.13工程配置界面

點(diǎn)擊“Finish”按鈕,就完成了工程的創(chuàng)建。第一次創(chuàng)建工程,在進(jìn)入工程頁面后,AndroidStudio會自動下載配置Gradle文件,可能需要等待一段時(shí)間。當(dāng)出現(xiàn)如圖1.14所示的界面時(shí),說明我們的“HelloWorld”工程創(chuàng)建成功。

圖1.14工程創(chuàng)建成功界面

下面運(yùn)行該工程。觀察上方工具欄,可以看到如圖1.15所示的三個(gè)按鈕。點(diǎn)擊中間的按鈕,會出現(xiàn)Android模擬器管理界面。由于新安裝還沒有任何模擬器,先點(diǎn)擊“CreateVirtualDevice”按鈕創(chuàng)建模擬器,會出現(xiàn)如圖1.16所示的界面。這里我們可以選擇PixelXL這臺設(shè)備。圖1.15頂部工具欄

圖1.16創(chuàng)建Android模擬器界面

點(diǎn)擊“Next”按鈕,會出現(xiàn)選擇模擬器操作系統(tǒng)版本的界面,如圖1.17所示。圖1.17選擇模擬器的操作系統(tǒng)版本

下載完成后點(diǎn)擊“Next”按鈕,出現(xiàn)如圖1.18所示的界面,可以對模擬器的分辨率、啟動方向等做一些設(shè)置,這里我們直接使用默認(rèn)值。點(diǎn)擊“Finish”按鈕即創(chuàng)建模擬器完成。點(diǎn)擊查看模擬器列表,會顯示該模擬器,如圖1.19所示。

圖1.18確認(rèn)模擬器配置的界面

圖1.19Android模擬器列表

模擬器配置好后,工具欄中也會出現(xiàn)模擬器的圖標(biāo),如圖1.20所示。點(diǎn)擊右側(cè)的綠色三角形按鈕,可以直接運(yùn)行工程。這里我們先點(diǎn)擊圖1.19中模擬器列表中“Actions”欄的綠色三角按鈕啟動模擬器,啟動后的模擬器如圖1.21所示。圖1.20工具欄中的模擬器圖1.21啟動后的模擬器界面

啟動模擬器,可以點(diǎn)擊圖1.20所示中工具欄模擬器旁邊的綠色三角按鈕即可運(yùn)行工程。運(yùn)行后的界面如圖1.22所示,第一個(gè)“HelloWorld”工程運(yùn)行成功,說明Android開發(fā)環(huán)境已經(jīng)搭建好。

圖1.22運(yùn)行HelloWorld后的界面

本章總結(jié)

本章是Android系統(tǒng)導(dǎo)論,首先介紹了Android系統(tǒng)的發(fā)展歷史,它可以讓讀者對Android系統(tǒng)的起源和發(fā)展有一個(gè)清晰的認(rèn)識;接下來介紹了Android系統(tǒng)的架構(gòu),使讀者了解Android系統(tǒng)的5層結(jié)構(gòu)及每一層的作用;最后介紹Android開發(fā)環(huán)境的搭建方法,包括Android開發(fā)工具、開發(fā)環(huán)境的搭建及測試等。通過本章的學(xué)習(xí),讀者對Android系統(tǒng)會有一個(gè)全局的認(rèn)識,可以搭建自己的Android開發(fā)環(huán)境。第2章Java基礎(chǔ)2.1Java語言簡介2.2Java語言基礎(chǔ)知識2.3Java語言的核心概念本章總結(jié)

2.1Java語言簡介Java是SunMicrosystems公司在1995年推出的一種面向?qū)ο蟮木幊陶Z言,由詹姆斯·戈士林設(shè)計(jì)完成。詹姆斯·戈士林也被稱為Java之父,他完成了Java原始編譯器和虛擬機(jī)的設(shè)計(jì)。Java原名為Oak,在1995年被正式以Java命名發(fā)布。Java吸收了C++語言的各種優(yōu)點(diǎn),同時(shí)摒棄了C++里難以理解的多繼承、指針等概念,使得Java具有簡單性、面向?qū)ο蟆⒎植际?、健壯性、安全性、平臺獨(dú)立與可移植性、多線程、動態(tài)性等特點(diǎn)。Java語言的應(yīng)用范圍也比較廣泛,可以用來編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。

Java語言有如下特點(diǎn)。

1.簡單性

Java看起來設(shè)計(jì)得很像C++,但是為了使語言精簡和可讀性強(qiáng),Java語言設(shè)計(jì)者們把C++語言中一般程序員很少使用的特征去掉了。

2.面向?qū)ο?/p>

和面向過程相比,面向?qū)ο蟾幼⒁鈶?yīng)用中的數(shù)據(jù)和操作數(shù)據(jù)的方法(method)。

3.分布性

Java既支持各種層次的網(wǎng)絡(luò)連接,又通過Socket類支持可靠的流(stream)網(wǎng)絡(luò)連接,所以用戶可以產(chǎn)生分布式的客戶機(jī)和服務(wù)器。

4.編譯和解釋性

Java編譯程序生成字節(jié)碼(byte-code),Java字節(jié)碼是Java源文件編譯產(chǎn)生的中間文件,Java程序可以在實(shí)現(xiàn)了Java解釋程序和運(yùn)行系統(tǒng)(run-timesystem)的平臺上運(yùn)行。

5.穩(wěn)健性

Java是一個(gè)強(qiáng)類型語言,它允許擴(kuò)展編譯時(shí)檢查潛在的類型不匹配問題。Java要求顯式的方法聲明,它不支持C語言中的隱式聲明。這些嚴(yán)格的要求保證程序在編譯時(shí)能捕捉到調(diào)用錯(cuò)誤,使得程序更加可靠。

6.安全性

Java的存儲分配模型是它防御惡意代碼的主要方法之一,Java編譯程序不處理存儲安排決策,所以程序員不能通過查看聲明去猜測類的實(shí)際存儲安排。

7.可移植性

Java程序具有與體系結(jié)構(gòu)無關(guān)的特性,所以非常方便移植到網(wǎng)絡(luò)上不同計(jì)算機(jī)中。同時(shí)Java還采用了一套與平臺無關(guān)的庫函數(shù),使得這些庫函數(shù)也可以被移植。

8.高性能

Java是一種先編譯后解釋的語言,所以它不如全編譯性語言快,為解決這個(gè)問題,Java設(shè)計(jì)者制作了“及時(shí)”編譯程序,它能在運(yùn)行時(shí)把Java字節(jié)碼翻譯成特定CPU(中央處理器)的機(jī)器代碼,從而提高運(yùn)行速度。

9.多線程性

Java中的多線程機(jī)制使得應(yīng)用程序在同一時(shí)間可以并行執(zhí)行多項(xiàng)任務(wù),從而帶來更好的交互能力和實(shí)時(shí)行為。

10.動態(tài)性

Java語言適應(yīng)于變化的環(huán)境,它是一個(gè)動態(tài)的語言。例如,Java中的類是根據(jù)需要載入的,甚至有些是通過網(wǎng)絡(luò)獲取的。

2.2Java語言基礎(chǔ)知識

目前主流的開發(fā)環(huán)境主要有以下兩種。

1.?EclipseEclipse作為Java的主要開發(fā)工具,是一個(gè)開放源代碼、基于Java的可擴(kuò)展開發(fā)平臺。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。

2.?IntelliJIDEA

IntelliJIDEA是由JetBrains推出的Java開發(fā)工具,開發(fā)過程中能夠智能提示相關(guān)的代碼,同樣也是配置好JDK環(huán)境就可以進(jìn)行Java開發(fā)。

首先我們點(diǎn)擊AndroidStudio主界面左上角的File,選擇New,然后選擇NewModule,將界面拉到最下面,如圖2.1所示。選擇JavaorKotlinLibrary,然后點(diǎn)擊Next,會出現(xiàn)配置模塊的界面,如圖2.2所示。這里需要填入庫的名稱以及Java類的名稱,讀者可以自己根據(jù)需要填寫,然后點(diǎn)擊Finish。

圖2.1導(dǎo)入新的模塊

圖2.2配置模塊界面

接下來我們觀察程序左側(cè),在程序結(jié)構(gòu)欄已出現(xiàn)了新創(chuàng)建的庫,如圖2.3所示。

如果點(diǎn)擊程序上方的Android選項(xiàng)可以將目錄切換成Project模式,如圖2.4所示。

圖2.3程序結(jié)構(gòu)欄

圖2.4切換為Project模式

2.2.1基本數(shù)據(jù)類型

在一個(gè)Java類中,程序通過main()方法可以成功運(yùn)行。以我們剛創(chuàng)建的MyClass類為例,修改MyClass類中的代碼:

publicclassMyClass{

publicstaticvoidmain(Stringargs[]){

System.out.println("HelloJava!");

}

}

該段代碼的含義是打印一段字符串“HelloJava!”。將打印語句放在main()方法中,就能夠?qū)崿F(xiàn)打印,效果如圖2.5所示。圖2.5打印字符串的值

在Java中規(guī)定了8種基本數(shù)據(jù)類型來存儲整數(shù)、浮點(diǎn)數(shù)、字符和布爾值,如圖2.6所示。這些數(shù)據(jù)類型可表示的數(shù)據(jù)范圍如表2.1所示。圖2.6Java的基本數(shù)據(jù)類型

運(yùn)行程序可以在Project欄中的Android模式下右鍵單擊MyClass文件,選擇Run'MyClass.main()',運(yùn)行的結(jié)果如圖2.7所示??梢钥吹?,所有類型的數(shù)據(jù)都在控制臺打印出來了。

圖2.7不同數(shù)據(jù)類型變量的打印結(jié)果

此外,還有一種基本數(shù)據(jù)類型是布爾型。對于布爾類型的變量,它的值只有true(真)或false(假)。右鍵單擊lib/edu.tust.lib,選擇New,再選擇JavaClass,新建一個(gè)類,將類名命名為JavaTest1。

運(yùn)行結(jié)果如圖2.8所示。

圖2.8布爾類型數(shù)據(jù)的打印結(jié)果

基本數(shù)據(jù)類型是可以強(qiáng)制進(jìn)行轉(zhuǎn)換的,比如兩個(gè)整數(shù)相除,最后不能得到整數(shù),那結(jié)果會是什么樣子?我們通過一個(gè)實(shí)例來演示一下,新建JavaTest2類。

運(yùn)行結(jié)果如圖2.9所示

圖2.9計(jì)算結(jié)果對比

2.2.2常量與變量

1.常量

常量就是固定不變的量,一旦定義了常量,那么它的值就不能再發(fā)生改變。聲明常量的關(guān)鍵字是final,后面接數(shù)據(jù)類型和名稱,然后可以對其進(jìn)行賦值,例如:

finaldoublePI=3.1415926;

當(dāng)常量用于一個(gè)類的成員變量時(shí),必須要給常量賦值,否則編譯不會通過。下面舉一個(gè)使用常量的例子,新建JavaTest3類:

publicclassJavaTest3{

staticfinalintMINUTES=1440;

publicstaticvoidmain(Stringargs[]){

System.out.println("Twodayshave"+2*MINUTES+"minutes.");

}

}

運(yùn)行結(jié)果如圖2.10所示

圖2.10常量的用法

2.變量

變量是可以變化的量,聲明一個(gè)變量時(shí),編譯程序會在內(nèi)存里開辟一塊足夠容納此變量的內(nèi)存空間給它。在程序編寫的過程中,既可以為變量重新賦值,也可以使用已經(jīng)聲明過的變量。

變量是有命名規(guī)則的,如果不按照命名規(guī)則來,程序會報(bào)錯(cuò),具體規(guī)則如下:

(1)變量名不能夠以數(shù)字進(jìn)行開頭;

(2)變量名可由任意順序的大小寫字母、數(shù)字、下劃線和$符號組成;

(3)變量名不能是Java中的關(guān)鍵字,比如new、static等。

在類中直接定義的變量為成員變量。它的作用范圍是整個(gè)類,只要在這個(gè)類中都可以訪問到該成員變量。舉個(gè)例子,新建JavaTest4類:

publicclassJavaTest4{

staticinta=100;

publicstaticvoidmain(Stringargs[]){

System.out.println("a="+a);

}

}

這里的變量a是直接定義在類中的,但是在main()方法中依然可以訪問到,這個(gè)就是成員變量,運(yùn)行結(jié)果如圖2.11所示。

圖2.11成員變量在全類中都可以訪問

如果讀者接觸過其他編程語言,那么對于for循環(huán)一定不會陌生,Java可以在任何地方聲明變量,所以在for循環(huán)中也可以聲明變量,只不過這個(gè)變量在跳出循環(huán)之后就不可再使用了,因此該變量屬于局部變量。

正常運(yùn)行之后,就會打印出i和sum的結(jié)果,如圖2.12所示。

圖2.12訪問局部變量的值

2.2.3運(yùn)算符

1.賦值運(yùn)算符

在前面的代碼中,幾乎都用到了賦值運(yùn)算符,賦值運(yùn)算符可以說是無處不在,下面舉例說明一下賦值運(yùn)算符的用法,新建JavaTest6類:

publicclassJavaTest6{

publicstaticvoidmain(Stringargs[]){

intnum=15;

num=num+8;

System.out.println("num="+num);

}

}

賦值通過“=”將后邊的值賦給前邊,運(yùn)行一下程序,結(jié)果如圖2.13所示。圖2.13賦值運(yùn)算符用法示例

2.一元運(yùn)算符

一元運(yùn)算符主要包括“+”“-”“!”“~”?!?”是正號,“-”是負(fù)號,“!”表示非和否的意思,“~”表示取補(bǔ)。

代碼中包含取負(fù)、取補(bǔ)以及非運(yùn)算,運(yùn)行結(jié)果如圖2.14所示。圖2.14一元運(yùn)算符用法示例的結(jié)果

3.算術(shù)運(yùn)算符

算術(shù)運(yùn)算符在數(shù)學(xué)中運(yùn)用較多,分別為加減乘除和取余,對應(yīng)符號為“+”“-”“*”“/”“%”。

運(yùn)行結(jié)果如圖2.15所示。

圖2.15算術(shù)運(yùn)算符用法示例結(jié)果

4.關(guān)系運(yùn)算符

關(guān)系運(yùn)算符多用于條件的判斷語句中,關(guān)系運(yùn)算符有六種,分別為大于、小于、大于等于、小于等于、等于、不等于,對應(yīng)的符號為“>”“<”“>=”、“<=”“==”“!=”。

運(yùn)行結(jié)果如圖2.16所示。圖2.16關(guān)系運(yùn)算符用法示例的結(jié)果

5.自增與自減運(yùn)算符

JavaTest5類中在寫for循環(huán)的時(shí)候,語句為for(inti=1;i<=3;i++),這里面就用到了自增運(yùn)算符“++”,相應(yīng)的自減運(yùn)算符為“--”,自增和自減運(yùn)算符的合理使用可以簡化程序。但是自增和自減只能將變量每次加1或者減1,如果變量需要加減非1的數(shù)時(shí),還需要使用原來的方法,比如“a=a–3”。

程序運(yùn)行結(jié)果如圖2.17所示。圖2.17自增運(yùn)算符用法示例的結(jié)果

6.邏輯運(yùn)算符

在數(shù)學(xué)中,邏輯關(guān)系有與和或的關(guān)系,如果兩個(gè)命題都為真命題,那么兩個(gè)命題與關(guān)系后也是真命題。如果兩個(gè)命題一真一假,那么或之后也是真命題。在Java中,也可以通過邏輯運(yùn)算符完成多條件融合在一起的判斷。邏輯與的符號為“&&”,邏輯或的符號為“||”。新建JavaTest11類,運(yùn)行結(jié)果如圖2.18所示。

圖2.18邏輯運(yùn)算符用法示例的結(jié)果

2.2.4條件語句

Java語言中的選擇結(jié)構(gòu)提供了兩種類型的分支結(jié)構(gòu)。一種是條件分支,即根據(jù)給定的條件進(jìn)行判斷,決定執(zhí)行某個(gè)分支的程序段;另一種是開關(guān)分支,即根據(jù)給定的整型表達(dá)式的值進(jìn)行判斷,然后決定執(zhí)行多路分支中的一支。

條件分支主要用于兩個(gè)分支的選擇,由if語句和if…else語句來實(shí)現(xiàn)。開關(guān)分支用于多個(gè)分支的選擇,由switch語句來實(shí)現(xiàn)。在語句中加上選擇結(jié)構(gòu)之后,程序會根據(jù)不同的選擇,運(yùn)行不同的結(jié)果。

1.?if語句

if語句用于實(shí)現(xiàn)條件分支結(jié)構(gòu),要根據(jù)判斷的結(jié)構(gòu)來執(zhí)行不同的語句時(shí),使用if語句是一個(gè)很好的選擇,它會準(zhǔn)確地檢測判斷條件成立與否,再決定是否要執(zhí)行后續(xù)的語句。if語句的流程如圖2.19所示。

圖2.19if語句流程圖

2.?if…else語句

對于if…else語句,如果判斷條件為真,則執(zhí)行if條件后的語句體;當(dāng)判斷條件不成立時(shí),則會執(zhí)行else后的語句體,隨后會繼續(xù)執(zhí)行整個(gè)if語句后邊的語句。if…else語句的流程如圖2.20所示。

圖2.20if…else語句流程圖

圖2.21if...else語句的用法示例的結(jié)果

3.?if…elseif…else語句

有多個(gè)條件需要判斷的時(shí)候,可以使用if…elseif…else語句,如果條件表達(dá)式為真,則執(zhí)行if條件后的語句體;當(dāng)判斷條件不成立時(shí),會執(zhí)行elseif條件后邊的語句體,在一段if…elseif…else語句中,可以有多個(gè)elseif同時(shí)存在;如果所有的elseif后邊的判斷條件都不成立,那么就執(zhí)行else后邊的語句體,隨后執(zhí)行整個(gè)if后面的語句,if…elseif…else語句的流程如圖2.22所示。

圖2.22if...elseif...else語句流程圖圖2.23if...elseif...else語句的用法示例的結(jié)果

4.條件運(yùn)算符

在Java中,有一種運(yùn)算符可以代替if…else語句,即條件運(yùn)算符,符號為“?:”,根據(jù)條件的成立與否,來決定結(jié)果為“:”前或“:”后的表達(dá)式,其格式如下:

程序運(yùn)行結(jié)果如圖2.24所示。圖2.24條件運(yùn)算符用法示例的結(jié)果

5.?switch語句

當(dāng)判斷條件比較多的時(shí)候,使用if…else語句容易造成混淆并使代碼的可讀性降低。這時(shí)使用switch語句就可以很好地解決,switch結(jié)構(gòu)稱為“多路選擇結(jié)構(gòu)”,它會在許多不同的語句組之間做出選擇。在switch語句中使用break語句可以使程序立即退出該結(jié)構(gòu),而后執(zhí)行該結(jié)構(gòu)后邊的第1條語句。

此處需注意兩點(diǎn):一是如果case語句結(jié)尾處無break語句,程序會一直執(zhí)行到switch語句的底端才會結(jié)束。二是如果沒有定義default要執(zhí)行的語句,就會直接跳出switch語句。switch語句的流程如圖2.25所示。

圖2.25switch語句的流程圖

運(yùn)行結(jié)果如圖2.26所示。圖2.26switch語句用法示例結(jié)果

2.2.5循環(huán)語句

循環(huán)結(jié)構(gòu)和選擇結(jié)構(gòu)一樣,也是一種非常重要的程序結(jié)構(gòu)。循環(huán)結(jié)構(gòu)的特點(diǎn)是給定的條件成立時(shí),反復(fù)執(zhí)行某一段代碼。一般稱給定條件為循環(huán)條件、反復(fù)執(zhí)行的代碼段為循環(huán)體。循環(huán)結(jié)構(gòu)包括while循環(huán)、for循環(huán),還可以各種循環(huán)嵌套在一起完成比較復(fù)雜的程序操作。

1.?while循環(huán)

while循環(huán)語句的執(zhí)行過程是先計(jì)算表達(dá)式的值,若表達(dá)式的值非零,則執(zhí)行循環(huán)體中的語句,繼續(xù)循環(huán),否則退出循環(huán),執(zhí)行while語句后面的語句。while循環(huán)的流程如下:第一次進(jìn)入while循環(huán)前先對表達(dá)式賦初始值,根據(jù)判斷條件的內(nèi)容決定是否繼續(xù)進(jìn)行循環(huán),如果條件為真就繼續(xù)循環(huán),反之則跳出循環(huán)執(zhí)行語句,在執(zhí)行完循環(huán)主體的語句后重新對循環(huán)控制變量進(jìn)行自增或自減操作,while循環(huán)中對循環(huán)控制變量賦值的工作要開發(fā)者自行完成,再重復(fù)此流程決定是否繼續(xù)執(zhí)行循環(huán)體。while循環(huán)流程圖如圖2.27所示。

圖2.27while循環(huán)流程圖

代碼實(shí)現(xiàn)的是1到100累加值的計(jì)算,在進(jìn)入循環(huán)體前,先將循環(huán)控制變量i的初始值賦為1,進(jìn)入while循環(huán)的判斷條件為i<=100,根據(jù)i的值和判斷條件,決定是否進(jìn)入循環(huán)體,運(yùn)行結(jié)果如圖2.28所示。

圖2.28while循環(huán)用法示例結(jié)果

2.?do…while循環(huán)

do…while循環(huán)的執(zhí)行過程是先執(zhí)行一次循環(huán)體,然后判斷表達(dá)式的值,如果是真,則再執(zhí)行循環(huán)體,繼續(xù)循環(huán),反之則退出循環(huán),執(zhí)行下面的語句。在進(jìn)入do…while循環(huán)前,要先對循環(huán)變量賦初始值,然后直接執(zhí)行循環(huán)主體,循環(huán)主體執(zhí)行完畢,才開始根據(jù)判斷條件的內(nèi)容決定是否繼續(xù)執(zhí)行循環(huán),執(zhí)行完循環(huán)主體內(nèi)的語句后,重新對循環(huán)控制變量進(jìn)行自增或自減。do…while循環(huán)流程如圖2.29所示。圖2.29do...while循環(huán)流程圖

代碼也是計(jì)算1到100累加的值,運(yùn)行結(jié)果如圖2.30所示。圖2.30do...while循環(huán)用法示例結(jié)果

3.?for循環(huán)

for循環(huán)是讀者一般比較熟悉的循環(huán)方式,for后面的小括號內(nèi)有三個(gè)表達(dá)式,即賦初值、判斷條件、賦值增減量,三個(gè)表達(dá)式之間用分號隔開。第一次進(jìn)入for循環(huán)時(shí),對循環(huán)控制變量賦初始值,根據(jù)判斷條件的內(nèi)容檢查是否要繼續(xù)執(zhí)行循環(huán),執(zhí)行完循環(huán)主體的語句后,循環(huán)控制變量會根據(jù)增減量的要求,更改循環(huán)控制變量的值,然后再判斷是否繼續(xù)執(zhí)行循環(huán)。for循環(huán)流程圖如圖2.31所示。

圖2.31for循環(huán)流程圖

程序運(yùn)行結(jié)果如圖2.32所示。圖2.32for循環(huán)示例的結(jié)果

當(dāng)然,循環(huán)之間也可以互相嵌套,實(shí)現(xiàn)比較復(fù)雜的程序操作。下面我們舉例演示如何用一個(gè)嵌套循環(huán)實(shí)現(xiàn)九九乘法表的打印。新建JavaTest19類,程序運(yùn)行結(jié)果如圖2.33所示。其中?'\n'?的意思是換行符。print和println的區(qū)別在于print打印時(shí)不會換行,而println打印后會自動換行。

圖2.33九九乘法表打印結(jié)果

2.2.6數(shù)組

1.一維數(shù)組

數(shù)組是有序數(shù)據(jù)的集合,數(shù)組中的每個(gè)元素具有相同的數(shù)據(jù)類型,可以用一個(gè)統(tǒng)一的數(shù)組名和下標(biāo)來唯一地確定數(shù)組中的元素。

代碼中定義了一個(gè)一維數(shù)組,利用冒泡排序算法實(shí)現(xiàn)了數(shù)組元素從小到大的排序。對于冒泡排序算法,讀者若有興趣可以查閱相關(guān)資料去深入理解。程序中a.length的意思是獲取數(shù)組a[]的長度,程序運(yùn)行結(jié)果如圖2.34所示。

圖2.34一維數(shù)組冒泡排序的結(jié)果

2.二維數(shù)組

二維數(shù)組同樣用new關(guān)鍵字來完成內(nèi)存的分配。

程序中通過兩個(gè)for循環(huán)打印出了二維數(shù)組中所有元素的值,并對所有的值進(jìn)行了求和操作,運(yùn)行結(jié)果如圖2.35所示。

圖2.35二維數(shù)組示例運(yùn)行結(jié)果

2.3Java語言的核心概念

2.3.1類與對象面向?qū)ο缶幊趟枷肫鹪从诂F(xiàn)實(shí)世界,在現(xiàn)實(shí)世界中人們會對事物進(jìn)行分類,在各種大類中,會有很多具體的事物去對應(yīng)這個(gè)類。Java將這個(gè)概念從現(xiàn)實(shí)世界延伸到了編程語言,在Java語言中,類是對某一類事物的描述,是抽象的、概念性的定義。對象是實(shí)際存在的該類事物的個(gè)體,因此也可稱之為實(shí)例。

程序訪問了Book類中的name屬性和price屬性并賦值,再調(diào)用purchase()方法打印信息,運(yùn)行程序,結(jié)果如圖2.36所示。圖2.36對象的使用示例

2.3.2繼承

面向?qū)ο缶幊趟枷氲木璨糠衷谟诳梢酝ㄟ^繼承的方式以原有的類為基礎(chǔ)派生出新的類,這樣可以不用編寫相同的代碼,減少代碼的冗余,提高運(yùn)行效率。

在Java中,通過繼承可以便利地寫出新的類,同時(shí)保留原有類中的部分屬性和方法,并拓展功能。Java與C++不同的地方在于,Java中不支持多繼承,只支持單繼承,但可以用多層繼承的方式來完成所需要的屬性和方法。

代碼中訪問了author對象和purchase1()方法,運(yùn)行程序,結(jié)果如圖2.37所示,可以看到,成功實(shí)現(xiàn)了類的繼承。

圖2.37繼承示例的結(jié)果

2.3.3抽象類與接口

Java中可以創(chuàng)建一種類作為父類,這樣的類叫做抽象類。抽象類也是類,只是和普通的類相比,多了一些抽象方法。抽象方法是只聲明而未實(shí)現(xiàn)的方法,聲明抽象類時(shí)需在前邊加入abstract關(guān)鍵字。

代碼實(shí)例化了AndroidBook2類的對象,調(diào)用了構(gòu)造方法初始化類的屬性。程序運(yùn)行結(jié)果如圖2.38所示。

圖2.38抽象類使用方法示例的結(jié)果

我們利用接口實(shí)現(xiàn)了JavaBook類,然后在JavaTest25中實(shí)例化了一個(gè)JavaBook類的對象javaBook,再調(diào)用purchase()方法進(jìn)行打印。程序運(yùn)行結(jié)果如圖2.39所示。圖2.39接口用法示例結(jié)果

2.3.4異常處理

在Java語言中提供了強(qiáng)大的異常處理機(jī)制,Java將所有的異常都封裝在一個(gè)類中,程序發(fā)生錯(cuò)誤時(shí)會將異常拋出:在寫程序代碼時(shí),一些小的錯(cuò)誤,比如語法上的錯(cuò)誤,在進(jìn)行代碼編寫時(shí)就會被提示;還有一些異常是在程序運(yùn)行中報(bào)出,用任何一個(gè)非零的數(shù)除以零就會報(bào)算數(shù)異常;因?yàn)榇a沒有處理好而導(dǎo)致沒有給對象開辟內(nèi)存空間而發(fā)生的空指針異常;由于找不到文件而報(bào)文件未找到異常等。

為了保證程序的正常運(yùn)行,Java中通過面向?qū)ο蟮姆椒▉硖幚懋惓?。如果在一個(gè)方法的運(yùn)行過程中發(fā)生異常,該方法會生成一個(gè)代表該異常的對象,并把它傳遞給系統(tǒng),運(yùn)行的系統(tǒng)會尋找相應(yīng)的方法來處理這一異常。

很顯然程序中有數(shù)組越界的錯(cuò)誤,我們來看下Java本身是如何處理異常的,運(yùn)行程序,結(jié)果如圖2.40所示??梢钥吹剑琂ava在執(zhí)行到數(shù)組越界那行代碼時(shí)會拋出異常,不再往下執(zhí)行。

圖2.40數(shù)組越界異常

這就是Java的異常處理機(jī)制,Java遇到異常后會先拋出異常,然后停止運(yùn)行程序。為解決這些問題,開發(fā)者可自行加入捕捉異常的代碼,針對不同的異常做相應(yīng)的處理,這樣的處理方式就稱為異常處理。

一般處理異常時(shí),try對應(yīng)的部分若有異常發(fā)生,程序就會中斷,隨后拋出異常類所產(chǎn)生的對象;然后判斷該對象是否屬于catch部分想要捕獲的異常類,如果是,catch就會捕捉到該異常,然后在catch部分繼續(xù)運(yùn)行;運(yùn)行完trycatch后,finally中的代碼都會執(zhí)行。異常處理的流程如圖2.41所示。

圖2.41異常處理的流程圖

代碼在try部分會捕捉到異常,然后程序會轉(zhuǎn)到catch部分去執(zhí)行,最后一定會執(zhí)行finally中的語句。程序運(yùn)行結(jié)果如圖2.42所示。圖2.42異常處理示例的結(jié)果

本章總結(jié)

本章主要介紹了Java的基礎(chǔ)知識,首先對Java語言的產(chǎn)生和發(fā)展做了簡要的說明;然后結(jié)合程序簡單介紹了Java語言中的基本數(shù)據(jù)類型、常量變量、運(yùn)算符、條件和循環(huán)語句及數(shù)組等知識;最后對Java語言中的核心概念,如類與對象、繼承、抽象類與接口及異常處理等內(nèi)容做了介紹。通過學(xué)習(xí)本章,沒有Java基礎(chǔ)的讀者可以對Java有所了解,便于后面的學(xué)習(xí)。第3章Android工程結(jié)構(gòu)3.1Project模式下的工程結(jié)構(gòu)3.2app目錄3.3res詳解3.4AndroidManifest.xml詳解3.5build.gradle詳解本章總結(jié)

3.1Project模式下的工程結(jié)構(gòu)

在新建的Android工程中,默認(rèn)的工程結(jié)構(gòu)為Android模式,但這并不是Android工程的真實(shí)結(jié)構(gòu)。在左上角將其切換為Project模式,如圖3.1所示,這才是Android工程的真實(shí)結(jié)構(gòu)。

圖3.1Project模式下的Android工程結(jié)構(gòu)

在Android工程的目錄結(jié)構(gòu)中,可以看到有很多文件,下面對這些文件進(jìn)行簡單介紹。

1.?.gradle

.gradle文件夾包含了gradle工具的各個(gè)版本。這個(gè)目錄下放置的文件都是由AndroidStudio自動生成的,用戶不要去手動編輯。

2.?.idea

.idea文件夾包含了開發(fā)所需的各種環(huán)境。這個(gè)目錄下的所有文件也是由AndroidStudio自動生成的,在沒有極特殊的需求時(shí)不要手動編輯里面的文件。

3.?app

app目錄包含了工程的功能邏輯、布局、資源、清單文件等內(nèi)容,開發(fā)工作基本上都是在該目錄下完成的。

4.?gradle

gradle目錄包含了gradlewrapper的配置文件,使用gradlewrapper的方式不需要將gradle提前下載好,AndroidStudio會根據(jù)本地的緩存情況自行決定是否需要聯(lián)網(wǎng)下載gradle。

5.?.gitignore

該文件用來將指定的目錄或文件排除在git提交的內(nèi)容之外。配置git需要忽略的文件或文件夾,在.gitignore中配置的文件或文件夾不會隨著git提交到指定的倉庫。

6.?build.gradle

該文件是項(xiàng)目全局的gradle構(gòu)建腳本,里面指定了很多與項(xiàng)目構(gòu)建相關(guān)的配置信息,通常情況下不需要修改文件中的內(nèi)容。

7.?perties

該文件是全局的gradle配置文件,用戶可以在里面做一些gradle文件的全局性配置,也可以將比較私密的信息放在里面,防止泄露。在該文件中配置的屬性會影響工程中所有的gradle編譯腳本。

8.?gradlew

該文件用于在Linux或Mac系統(tǒng)中的命令行界面執(zhí)行g(shù)radle命令。

9.?gradle.bat

該文件用于在Windows系統(tǒng)中的命令行界面執(zhí)行g(shù)radle命令。

10.?HelloWorld2.iml

AndroidStudio是基于IntelliJIDEA開發(fā)的一款編程工具,而.iml文件是所有IntelliJIDEA工程都會自動生成的一個(gè)文件,用于表示該工程是一個(gè)IntelliJIDEA工程。用戶不需要修改該文件中的任何內(nèi)容。

11.?perties

該文件用于指定AndroidSDK和NDK所在的路徑,內(nèi)容是自動生成的,一般不需要修改。如果本機(jī)中的AndroidSDK或NDK位置發(fā)生了變化或者工程在新的設(shè)備上打開,那么將該文件中的路徑換成新的路徑即可。

12.?settings.gradle

settings.gradle默認(rèn)只執(zhí)行當(dāng)前目錄下的build.gradle腳本,一般的工程中可能有多個(gè)模塊依賴,但本工程中只有一個(gè)app模塊,因此該文件中只引入了一個(gè)模塊app,如果有其他模塊依賴,則還需在文件中引入其他模塊。該文件需要手動修改的場景比較少。

以上是對Android工程中整個(gè)外層目錄的介紹。其實(shí)大部分文件都不需要開發(fā)者去手動修改。在Android開發(fā)中,開發(fā)者的工作重心主要在app目錄下,3.2節(jié)會對app目錄的內(nèi)容進(jìn)行重點(diǎn)講解。

3.2app目錄

點(diǎn)擊app目錄展開,如圖3.2所示。下面介紹app目錄下的具體內(nèi)容。

圖3.2app目錄下的內(nèi)容

1.?build

該目錄下包含了編譯時(shí)自動生成的一些文件,用戶無須關(guān)心里邊的內(nèi)容。

2.?libs

在比較大型的Android工程中,除了使用AndroidSDK進(jìn)行開發(fā)之外,很可能會使用第三方SDK來進(jìn)行開發(fā),一般的第三方SDK都是以jar包的形式存在的,要使用這些jar包就必須將其放置在libs目錄下,重新同步gradle后即可使用。

3.?androidTest

這里可以編寫一些androidTest測試用例,對工程進(jìn)行一些自動化測試。

4.?java

整個(gè)Android工程的所有java代碼都會放置在該目錄下,功能邏輯的開發(fā)一般在此目錄下完成。

5.?res

Android工程中所有的資源、布局文件都要放置在該目錄下,所有Android程序應(yīng)用界面的開發(fā)都離不開該目錄。

6.?AndroidManifest.xml

該文件是整個(gè)Android工程的配置文件,如果工程中使用到了四大組件必須先在該文件中進(jìn)行注冊;此外Android應(yīng)用程序中需要申請的權(quán)限也可以在該文件中添加。

7.?test

該文件用來編寫UnitTest測試用例。

8.?.gitignore

該文件用來將app模塊內(nèi)指定的目錄或文件排除在git提交之外,與外層的.gitignore文件作用類似。

9.?app.iml

與外層的HelloWorld2.iml文件差不多,該文件也屬于IntelliJIDEA工程自動生成的文件,開發(fā)者不必關(guān)心文件里的內(nèi)容。

10.?build.gradle

該文件為app模塊的gradle構(gòu)建文件,里面有很多與工程相關(guān)的配置,在添加一些依賴或其他操作的時(shí)候會對該文件中的內(nèi)容進(jìn)行修改。

11.?

該文件用于指定工程中代碼的混淆規(guī)則,在完成一項(xiàng)工程的開發(fā)后要對代碼進(jìn)行編譯打包生成?.apk安裝文件。如果開發(fā)者不希望安裝包被別人破解,通常會對代碼進(jìn)行混淆處理,提高安全性,使其不易被破解。

3.3res詳解

開發(fā)Android應(yīng)用程序時(shí),一般都會用到圖片、字符串、布局文件等資源,這些資源都可以系統(tǒng)化地放置在res目錄下的不同文件夾中。展開res目錄,如圖3.3所示。

圖3.3res目錄下的內(nèi)容

從圖3.3中可以看到,res目錄下有很多以“mipmap”開頭的文件夾,mipmap是用來放置啟動器圖標(biāo)的,后面跟的“hdpi”“xhdpi”等表示的是不同的分辨率,是為了滿足程序?qū)Σ煌直媛试O(shè)備的兼容性。

此外還可以手動創(chuàng)建目錄。如建立的是menu目錄,在menu目錄下放置.xml文件可以為應(yīng)用程序添加菜單;如建立raw目錄,可以在其中放入任意文件,比如音頻、圖片等資源。

3.4AndroidManifest.xml詳解

每個(gè)Android應(yīng)用程序都有一個(gè)清單文件——AndroidManifest.xml,該文件在src/main目錄下,程序中定義的四大組件都要在這個(gè)文件里注冊,這些組件構(gòu)成了整個(gè)應(yīng)用程序。此外還可以在該文件中添加應(yīng)用程序的權(quán)限聲明。清單文件中的信息會配置到Android系統(tǒng)中,當(dāng)程序運(yùn)行時(shí),系統(tǒng)會根據(jù)清單文件中的信息打開相應(yīng)的組件。

<manifest>節(jié)點(diǎn)是清單文件的根節(jié)點(diǎn),是整個(gè)應(yīng)用程序的基本屬性,其中必須指定xmlns:android和package屬性,并且必須包含一個(gè)<application>節(jié)點(diǎn),在該節(jié)點(diǎn)中聲明應(yīng)用程序的組件及屬性(如title,icon,theme等)。同時(shí)它又表現(xiàn)為一個(gè)容器,容納四大組件Activity、Service、ContentProvider、BroadcastReceiver的標(biāo)簽。

應(yīng)用程序中顯示的Activity都要在<manifest>中定義一個(gè)activity標(biāo)簽,通過android:name特性來指定類名,需要啟動和交互的Activity必須在manifest中定義。嘗試啟動一個(gè)沒有在manifest中定義的Activity會引發(fā)運(yùn)行時(shí)的異常。intent-filter子標(biāo)簽用于指定啟動哪些Activity,在本例中,MainActivity通過intent-filter被指定為主Activity,在啟動應(yīng)用程序后會自動打開MainActivity這個(gè)Activity。

此外,在清單文件中,uses-permission標(biāo)簽可以將應(yīng)用程序中用到的權(quán)限添加進(jìn)去,在Android6.0以前,安裝程序之前必須獲得所有權(quán)限。在Android6.0之后,引入了動態(tài)權(quán)限的概念,用戶可以在程序運(yùn)行時(shí)逐一授權(quán),即便是有些權(quán)限沒有授予,程序的其他功能的使用也不受影響。

3.5build.gradle詳解

AndroidStudio是采用Gradle來構(gòu)建工程的。Gradle是一種依賴管理工具,基于Groovy語言,面向Java應(yīng)用為主,它拋棄了基于XML的各種煩瑣配置,用一種基于Groovy的內(nèi)部領(lǐng)域特定(DSL)語言代替。一個(gè)新建的Android工程會有兩個(gè)build.gradle文件,一個(gè)在外層目錄中,另外一個(gè)在app模塊下,兩個(gè)文件缺一不可。

在dependencies閉包中使用classpath聲明一個(gè)插件,即Gradle插件。聲明Gradle插件是因?yàn)镚radle并不是專門用于Android工程構(gòu)建的,Java、C++等項(xiàng)目都可以使用Gradle來構(gòu)建。如果要使用Gradle來構(gòu)建Android工程,就需要聲明該插件,聲明的方式為“com.android.tools.build:gradle:4.0.1”,最后的數(shù)字為版本號,一般就是AndroidStudio的版本號。最后聲明了一個(gè)clean的task,它會在執(zhí)行g(shù)radleclean時(shí),刪除根目錄的build目錄。

app模塊的build.gradle文件會比外層目錄的復(fù)雜一些。文件中首先用applyplugin聲明了一個(gè)插件,一般有兩種選擇,“com.android.application”和“com.android.library”,前者表示的是應(yīng)用程序模塊,后者表示的是庫模塊,兩者最大的區(qū)別在于一個(gè)可以直接運(yùn)行,而另一個(gè)只能依附于應(yīng)用程序運(yùn)行。

最后還有個(gè)很重要的dependencies閉包,功能非常強(qiáng)大,可以指定當(dāng)前工程的所有依賴關(guān)系。依賴關(guān)系一共有三種:本地依賴、庫依賴和遠(yuǎn)程依賴,本地依賴可以在工程中加入第三方的jar包;庫依賴可以對工程中的庫模塊添加依賴關(guān)系,遠(yuǎn)程依賴可以對jcenter倉庫上的開源代碼或工程進(jìn)行依賴。一般來說,一個(gè)Android工程中需要包含上述代碼中所示的依賴關(guān)系。

本章總結(jié)

本章主要介紹了AndroidStudio的工程結(jié)構(gòu),首先是對工程的目錄及內(nèi)容進(jìn)行了簡單的說明,然后對工程目錄下比較重要、也是開發(fā)者關(guān)注的app目錄進(jìn)行了詳細(xì)的闡述,最后對res目錄、AndroidManifest.xml及build.gradle等文件作了詳細(xì)的介紹,學(xué)完本章節(jié)讀者可以對一個(gè)AndroidStudio工程結(jié)構(gòu)有深入的了解。第4章Activity4.1Activity的概念4.2Activity的基本使用方法4.3Intent在Activity中的使用4.4Activity的生命周期4.5Activity的啟動模式4.6Android系統(tǒng)的日志工具——Log本章總結(jié)

4.1Activity的概念

Activity是Android的四大組件之一,定義用戶可以觸摸看到的界面,主要用于和用戶進(jìn)行交互。Activity內(nèi)使用各種界面組件,可實(shí)現(xiàn)交互動作;通過Activity,用戶界面之間切換以及數(shù)據(jù)交換,進(jìn)行數(shù)據(jù)傳遞。

4.2Activity的基本使用方法4.2.1手動創(chuàng)建Activity在手動創(chuàng)建一個(gè)Activity之前,我們需要先創(chuàng)建一個(gè)新的工程。打開AndroidStudio,點(diǎn)擊FileNewNewProject,然后選擇AddNoActivity(不添加Activity),并點(diǎn)擊Next按鈕,輸入自定義項(xiàng)目名稱和包名,也可以選擇默認(rèn)(此處輸入的項(xiàng)目名是ActivityTest,包名為edu.tust.activitytest),如圖4.1所示;接著點(diǎn)擊Finish按鈕,如圖4.2所示,等待Gradle構(gòu)建完成。至此一個(gè)沒有添加Activity的新工程就創(chuàng)建完成了,下面開始在這個(gè)工程里手動創(chuàng)建一個(gè)Activity。

圖4.1選擇AddNoActivity

圖4.2創(chuàng)建一個(gè)新的項(xiàng)目

將工程結(jié)構(gòu)手動改為Project模式,如圖4.3所示。

由于創(chuàng)建工程時(shí)選擇的是AddNoActivity,因此app/src/main/java/edu.tust.activitytest目錄下是空的,此時(shí)右擊edu.tust.activitytest,選擇NewActivityEmptyActivity,會彈出如圖4.4所示的對話框,讀者可自定義Activity名(這里默認(rèn)為MainActivity)。對話框中的GenerateLayoutFile用于自動為MainActivity創(chuàng)建一個(gè)對應(yīng)的布局文件;LauncherActivity用于自動將MainActivity設(shè)置為當(dāng)前工程的主Activity。由于本小節(jié)學(xué)習(xí)的是手動創(chuàng)建一個(gè)Activity,因此不要勾選GenerateLayoutFile和LauncherActivity。圖4.4手動創(chuàng)建Activity

4.2.2手動創(chuàng)建并加載布局

布局是用來顯示界面內(nèi)容的,下面介紹手動創(chuàng)建并加載布局。在app/src/main目錄下,右鍵點(diǎn)擊resNewDirectory,會彈出一個(gè)新建目錄的窗口,如圖4.5所示。新建一個(gè)名為layout的目錄,點(diǎn)擊OK按鈕即可。

圖4.5新建layout目錄

接著選擇新創(chuàng)建的layout目錄,然后右鍵點(diǎn)擊NewLayoutresourcefile,彈出一個(gè)新建布局資源文件的窗口,讀者可自定義布局文件名(讀者命名為main_layout),根元素默認(rèn)選擇為LinearLayout,如圖4.6所示。最后點(diǎn)擊OK按鈕完成布局文件的創(chuàng)建。

圖4.6新建布局文件

完成手動創(chuàng)建布局文件后,AndroidStudio上會出現(xiàn)布局編輯器,如圖4.7所示。

圖4.7布局編輯器

4.2.3在AndroidManifest文件中注冊

AndroidManifest文件在app/src/main目錄下,需要注意的是,所有的Activity都需要在AndroidManifest.xml中注冊才能生效。

可以看到,Activity的注冊聲明要在<application>標(biāo)簽內(nèi),通過<activity>標(biāo)簽可對Activity進(jìn)行注冊。在<activity>標(biāo)簽中使用android:name可指明具體注冊的Activity名,這里填入的.MainActivity是edu.tust.activitytest.MainActivity的縮寫。因?yàn)樵谧钔鈱?lt;manifest>標(biāo)簽中已經(jīng)通過package屬性指定程序的包名,即edu.tust.activitytest,所以在注冊Activity的時(shí)候這一部分可以省略,直接使用.MainActivity即可。

在AndroidManifest文件中還需要為主程序配置主Activity,即當(dāng)程序運(yùn)行時(shí)首先啟動的Activity。為主程序配置Activity需要在<activity>標(biāo)簽的內(nèi)部加入<intent-filter>標(biāo)簽,并且在<intent-filter>標(biāo)簽里面添加<actionandroid:name="ent.action.MAIN"/>和<categoryandroid:name="ent.category.LAUNCHER"/>聲明,其中ent.action.MAIN決定程序啟動時(shí)最先顯示的Activity;ent.category.LAUNCHER表示Activity應(yīng)該被列入系統(tǒng)啟動器。

此外,還可以在<activity>標(biāo)簽內(nèi)通過android:label為Activity指定標(biāo)題欄內(nèi)容,標(biāo)題欄顯示在Activity最頂部。

運(yùn)行程序,結(jié)果如圖4.8所示。

圖4.8運(yùn)行結(jié)果

4.2.4使用Toast提醒方式

Toast是Android系統(tǒng)提供的一種提醒方式,它可以在程序運(yùn)行時(shí)提示用戶一些簡短的信息,這些信息并不會長時(shí)間顯示,而是在一段時(shí)間后就消失了,不會占用屏幕的空間。

代碼中通過findViewById()方法獲取布局文件中定義的元素R.id.button,從而得到Button按鈕實(shí)例。接著為Button按鈕注冊一個(gè)監(jiān)聽器,當(dāng)點(diǎn)擊按鈕時(shí)便會執(zhí)行監(jiān)聽器中的onClick()方法。Toast提醒的內(nèi)容需要在onClick()方法中實(shí)現(xiàn)。通過Toast的靜態(tài)方法makeText()創(chuàng)建一個(gè)Toast對象,然后通過調(diào)用show()方法在界面顯示。其中makeText()方法中需要傳入三個(gè)參數(shù):第一個(gè)參數(shù)是Context,是Toast的上下文,由于Activity本身就是一個(gè)Context對象,因此使用當(dāng)前Activity的名字即可;第二個(gè)參數(shù)是Toast需要顯示的內(nèi)容;第三個(gè)參數(shù)是內(nèi)容顯示的時(shí)長,可以選擇Toast.LENGTH_SHORT或Toast.LENGTH_LONG這兩個(gè)內(nèi)置常量,其中Toast.LENGTH_SHORT顯示的時(shí)長大約2秒,而Toast.LENGTH_LONG顯示的時(shí)長約3.5秒。

運(yùn)行程序,點(diǎn)擊界面上的按鈕,會看到Toast提醒信息,如圖4.9所示。

圖4.9Toast提醒

4.2.5使用Menu

由于手機(jī)屏幕的空間非常有限,在手機(jī)應(yīng)用程序中如何充分利用屏幕空間顯得非常重要。如果在Activity中需要顯示多個(gè)菜單,那么可以使用Android提供的一種方式——Menu,它不僅不占用屏幕空間,還可以讓許多菜單里的界面都顯示出來。

右鍵點(diǎn)擊res目錄下的NewDirectory,新建一個(gè)menu文件夾,如圖4.10所示,點(diǎn)擊OK按鈕完成創(chuàng)建。

圖4.10新建menu文件夾

在新建的menu文件夾下右鍵點(diǎn)擊NewMenuresourcefile,新建一個(gè)名為main的資源文件,如圖4.11所示,點(diǎn)擊OK按鈕完成創(chuàng)建。圖4.11新建Menu資源文件

回到MainActivity.java中,在AndroidStudio的菜單欄中選擇CodeOverrideMethods…(也可以通過快捷方式Ctrl+O),這時(shí)會彈出如圖4.12所示的窗口,找到onCreateOptionsMenu()并選中,點(diǎn)擊OK按鈕。

圖4.12重寫onCreateOptionsMenu()方法

在onCreateOptionsMenu()方法中通過getMenuInflater()方法可以得到MenuInflater對象,然后調(diào)用inflate()方法就可以給當(dāng)前Activity(MainActivity)創(chuàng)建菜單。在inflate()方法中接收兩個(gè)參數(shù),第一個(gè)參數(shù)是指定資源文件;第二個(gè)參數(shù)是指定菜單項(xiàng)將添加到哪一個(gè)Menu對象中。方法返回true,表示允許所創(chuàng)建的菜單顯示出來;返回false,表示不允許所創(chuàng)建的菜單顯示出來。

完成重寫onCreateOptionsMenu()方法后還需要定義菜單響應(yīng)事件,這樣創(chuàng)建的菜單不僅可以顯示出來,還可以有響應(yīng)事件。定義菜單響應(yīng)事件需要重寫onOptionsItemSelected()方法同上(或使用快捷方式:Ctrl+O),選中onOptionsItemSelected(),點(diǎn)擊OK按鈕,如圖4.13所示。

圖4.13重寫onOptionsItemSelected()方法

重新運(yùn)行程序,發(fā)現(xiàn)屏幕的右上方多了一個(gè)“”的符號,點(diǎn)擊后看到新創(chuàng)建的菜單項(xiàng),然后點(diǎn)擊其中任一菜單項(xiàng)都會有相應(yīng)的Toast提醒。具體如圖4.14所示。

圖4.14點(diǎn)擊帶菜單按鈕的Activity運(yùn)行界面

4.2.6銷毀Activity

前面學(xué)習(xí)了如何創(chuàng)建Activity,接下來學(xué)習(xí)如何銷毀Activity。其實(shí)銷毀Activity非常簡單,點(diǎn)擊返回鍵就可以銷毀當(dāng)前Activity。下面我們添加一個(gè)按鈕,通過點(diǎn)擊按鈕的方式銷毀Activity。

4.3Intent在Activity中的使用

Intent大致可以分為顯式Intent和隱式Intent兩種。Intent具有多個(gè)構(gòu)造函數(shù)的重載,其中一個(gè)是Intent(ContextpackageContext,Class<?>cls),該構(gòu)造函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)Context要求提供一個(gè)啟動Activity的上下文;第二個(gè)參數(shù)Class指定需要啟動的目標(biāo)Activity。

4.3.1使用顯式Intent

在4.2節(jié)創(chuàng)建的工程中,選中app/src/main/java/edu.tust.activitytest目錄,右鍵點(diǎn)擊NewActivityEmptyActivity,在彈出的對話框中自定義將創(chuàng)建的Activity名(SecondaryActivity)和布局名(secondary_layout),選中GenerateLayoutFile,但不要勾選LauncherActivity,如圖4.15所示。

圖4.15創(chuàng)建SecondaryActivity

點(diǎn)擊Finish按鈕完成創(chuàng)建,AndroidStudio會自動生成SecondaryActivity.java和Secondary_layout.xml兩個(gè)文件。

可以看到,程序中使用的是LinearLayout布局,然后在AndroidManifest.xml中為AndroidStudio自動生成的SecondaryActivity加一個(gè)label標(biāo)簽,

重新運(yùn)行程序,在主Activity界面上點(diǎn)擊“啟動第二個(gè)活動”,跳轉(zhuǎn)到我們創(chuàng)建的第二個(gè)Activity,如圖4.16所示。

圖4.16顯示Intent從第一個(gè)Activity跳轉(zhuǎn)至第二個(gè)Activity

4.3.2使用隱式Intent

隱式Intent中并不明確指出想要啟動哪一個(gè)Activity,而是指定了一系列更為抽象的action和category等信息,然后由系統(tǒng)去分析Intent,并啟動目標(biāo)Activity。使用隱式Intent需要經(jīng)過以下步驟:

首先,在AndroidManifest.xml文件中的<activity>標(biāo)簽下,為創(chuàng)建的SecondaryActivity添加<intent-filter>,并指定SecondaryActivity能夠響應(yīng)的action和category。

可以看到,在<activity>標(biāo)簽中指明了當(dāng)前Activity可以響應(yīng)edu.tust.activitytest.ACTION_START這個(gè)action,在<category>標(biāo)簽中包含一些附加信息,這里的ent.category.DEFAULT是一種默認(rèn)的category,在調(diào)用startActivity()方法時(shí)會自動將category添加到Intent中。需要注意的是,只有<action>和<category>中的內(nèi)容同時(shí)匹配上Intent中指定的action和category時(shí),對應(yīng)的Activity才會響應(yīng)。

修改main_layout.xml中的代碼,在主Activity的布局文件中再添加一個(gè)Button按鈕。

重新運(yùn)行程序,點(diǎn)擊“啟動第二個(gè)活動(隱式)”按鈕,程序跳轉(zhuǎn)到第二個(gè)Activity,如圖4.17所示。

圖4.17隱式Intent啟動Activity

最后重新運(yùn)行程序,點(diǎn)擊“啟動第二個(gè)活動(帶CATEGORY)”按鈕,同樣會跳轉(zhuǎn)到SecondaryActivity,如圖4.18所示。

圖4.18帶CATEGORY從第一個(gè)Activity跳轉(zhuǎn)至第二個(gè)Activity

4.3.3使用隱式Intent啟動其他Activity

使用隱式Intent不僅可以啟動程序內(nèi)部的Activity,還可以啟動程序外部的Activity。比如需要在應(yīng)用程序中展示網(wǎng)頁時(shí),不用專門實(shí)現(xiàn)一個(gè)瀏覽器,只需調(diào)用系統(tǒng)瀏覽器打開網(wǎng)頁即可。使用隱式Intent使得在多個(gè)Android應(yīng)用之間實(shí)現(xiàn)功能共享成為可能。

重新運(yùn)行程序,然后點(diǎn)擊“打開TUST官網(wǎng)”按鈕,這時(shí)會自動打開瀏覽器并跳轉(zhuǎn)到TUST官網(wǎng),如圖4.19所示。

圖4.19隱式Intent啟動系統(tǒng)瀏覽器

此外還可以在<intent-filter>標(biāo)簽中配置一個(gè)<data>標(biāo)簽,用于更精確地指定當(dāng)前Activity所能響應(yīng)的數(shù)據(jù)。<data>標(biāo)簽屬性如表4.1所示。

4.3.4傳遞數(shù)據(jù)給下一個(gè)Activity

Intent中提供了一系列putExtra()方法的重載,將要傳遞的數(shù)據(jù)暫時(shí)存在Intent中,在啟動另一個(gè)Activity后,只需要把數(shù)據(jù)從Intent中取出即可。

傳遞的是字符串,所以使用getStringExtra()方法來獲取傳遞的數(shù)據(jù)。如果傳遞的是整型數(shù)據(jù),則使用getIntExtra()方法;如果傳遞的是布爾型數(shù)據(jù),則使用getBooleanExtra()方法,以此類推。

重新運(yùn)行程序,點(diǎn)擊剛添加的按鈕,會跳轉(zhuǎn)到SecondaryActivity,觀察Logcat中打印的信息,如圖4.20所示,表明已經(jīng)成功將數(shù)據(jù)從MainActivity傳遞給SecondaryActivity。

圖4.20Logcat打印的信息

4.3.5返回?cái)?shù)據(jù)給上一個(gè)Activity

返回?cái)?shù)據(jù)給上一個(gè)Activity需要用到startActivityForResult()方法,該方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是Intent;第二個(gè)參數(shù)是請求碼,用于在回調(diào)中判斷數(shù)據(jù)的來源。

可以看到,將要傳給MainActivity的數(shù)據(jù)存放在intent中,然后調(diào)用setResult()方法。setResult()方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)用于向上一個(gè)Activity返回結(jié)果,一般有RESULT_OK和RESULT_CANCEL兩個(gè)值,第二個(gè)參數(shù)把帶有數(shù)據(jù)的intent傳回去,接著調(diào)用finish()方法銷毀該Activity。

重新運(yùn)行程序,點(diǎn)擊MainActivity界面按鈕便會跳轉(zhuǎn)至SecondaryActivity,然后點(diǎn)擊SecondaryActivity界面上的按鈕便可以返回到MainActivity,這時(shí)注意觀察Logcat的打印信息,如圖4.21所示。圖4.21Logcat打印的信息

4.4Activity的生命周期

Android中使用任務(wù)(Task)來管理Activity,一個(gè)任務(wù)就是一組存放在棧里的Activity集合,這里引入返回棧(BackStack)的概念。棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),默認(rèn)情況下,每當(dāng)啟動一個(gè)新的Activity時(shí),它都會在返回棧中入棧,并且處于棧頂?shù)奈恢谩C慨?dāng)按下Back返回鍵或者調(diào)用finish()方法銷毀一個(gè)Activity時(shí),處于棧頂?shù)腁ctivity就會出棧,此時(shí)上一個(gè)入棧的Activity就會重新處于棧頂?shù)奈恢谩O到y(tǒng)總是顯示處于棧頂位置的Activity。返回棧的示意圖如圖4.22所示。

圖4.22返回棧的示意圖

4.4.1Activity的四種狀態(tài)

每個(gè)Activity在其生命周期中都有四種狀態(tài),分別為運(yùn)行狀態(tài)、暫停狀態(tài)、停止?fàn)顟B(tài)和銷毀狀態(tài)。

1.運(yùn)行狀態(tài)

當(dāng)一個(gè)Activity位于返回棧的棧頂時(shí),它處于可見并可與用戶交互的激活狀態(tài),即為運(yùn)行狀態(tài)。

2.暫停狀態(tài)

當(dāng)一個(gè)Activity不再處于返回棧的棧頂位置,但依然可見時(shí),該Activity就會進(jìn)入暫停狀態(tài)。并不是所有的Activity都會占滿整個(gè)屏幕,例如,對話框形式的Activity只會占用部分屏幕空間。這種處于暫停狀態(tài)的Activity依然是存活的。

3.停止?fàn)顟B(tài)

當(dāng)一個(gè)Activity不再處于返回棧的棧頂位置,并且完全不可見時(shí),該Activity就處于停止?fàn)顟B(tài)。此時(shí)系統(tǒng)仍然會給處于停止?fàn)顟B(tài)的Activity保存相應(yīng)的狀態(tài)和成員變量。但是,當(dāng)其他地方需要內(nèi)存時(shí),處于停止?fàn)顟B(tài)的Activity就有可能被系統(tǒng)回收。

4.銷毀狀態(tài)

當(dāng)一個(gè)Activity從返回棧中被

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論