原創(chuàng):有趣知識點(diǎn)摸索型文章
創(chuàng)作不易朽合,請珍惜鉴裹,之后會(huì)持續(xù)更新,不斷完善
個(gè)人比較喜歡做筆記和寫總結(jié)廷没,畢竟好記性不如爛筆頭哈哈糊饱,這些文章記錄了我的IOS成長歷程,希望能與大家一起進(jìn)步
溫馨提示:由于簡書不支持目錄跳轉(zhuǎn)颠黎,大家可通過command + F 輸入目錄標(biāo)題后迅速尋找到你所需要的內(nèi)容
目錄
- 一另锋、運(yùn)行項(xiàng)目
- 二、工程的目錄結(jié)構(gòu)
- 三狭归、解析默認(rèn) Demo
一夭坪、運(yùn)行項(xiàng)目
打開 Android Studio
創(chuàng)建一個(gè)新的 Empty Activity
項(xiàng)目,命名為 BoostTestIOS
过椎。
進(jìn)入開發(fā)界面后室梅,我們發(fā)現(xiàn)沒有可以運(yùn)行的模擬器。
于是在Tools
工具欄中選擇 Device Manager
打開設(shè)備管理器疚宇,并在其中點(diǎn)擊Create Device
按鈕來打開創(chuàng)建新設(shè)備面板亡鼠。
選擇一個(gè)設(shè)備型號,按需選擇灰嫉,然后點(diǎn)擊 Next
進(jìn)行安裝拆宛。
在自己需要的版本后面點(diǎn)擊下載。
現(xiàn)在就可以在 Device Manager
上看到我們的模擬器了讼撒。
點(diǎn)擊運(yùn)行浑厚。就可以看到項(xiàng)目順利運(yùn)行起來了股耽。
二、工程的目錄結(jié)構(gòu)
Android 結(jié)構(gòu)模式
任何一個(gè)新建的項(xiàng)目都會(huì)默認(rèn)使用Android
模式的項(xiàng)目結(jié)構(gòu)钳幅,但這并不是項(xiàng)目真實(shí)的目錄結(jié)構(gòu)物蝙,而是被Android Studio
轉(zhuǎn)換過的。這種項(xiàng)目結(jié)構(gòu)簡潔明了敢艰,適合進(jìn)行快速開發(fā)诬乞。
項(xiàng)目結(jié)構(gòu)模式下的目錄分析
點(diǎn)擊上圖當(dāng)中的Android
區(qū)域可以切換項(xiàng)目結(jié)構(gòu)模式。
-
.gradle 和 .idea:這兩個(gè)目錄下放置的都是
Android Studio
自動(dòng)生成的一些文件钠导,我們無需關(guān)心震嫉,也不要手動(dòng)編輯。 - app:項(xiàng)目中的代碼牡属、資源等內(nèi)容都是放置在這個(gè)目錄下票堵,我們后面的開發(fā)工作也基本是在這個(gè)目錄下進(jìn)行。
- build:這個(gè)目錄主要包含了一些在編譯時(shí)自動(dòng)生成的文件逮栅,無需過多關(guān)心悴势。
-
gradle:目錄下包含了
gradle wrapper
的配置文件,使用gradle wrapper
的方式不需要提前將gradle
下載好措伐,而是會(huì)自動(dòng)根據(jù)本地的緩存情況決定是否需要聯(lián)網(wǎng)下載gradle
特纤。Android Studio
默認(rèn)就是啟動(dòng)gradle wrapper
方式的,如果需要更改成離線模式侥加,可以點(diǎn)擊Android Studio
導(dǎo)航欄—File
—Settings
—Build
捧存、Execution
、Deployment
—Gradle
進(jìn)行配置更改官硝。 - gitignore:這個(gè)文件是用來指定的目錄或文件排除在版本控制之外的矗蕊。
-
build.gradle:項(xiàng)目全局的
gradle
構(gòu)建腳本,通常這個(gè)文件內(nèi)容不需要修改氢架。 -
gradle.properties: 這個(gè)文件是全局的
gradle
配置文件傻咖,在這里配置的屬性將會(huì)影響到項(xiàng)目中所有的gradle
編譯腳本。 -
gradlew 和 gradlew.bat:這兩個(gè)文件是用來在命令行界面中執(zhí)行
gradle
命令的岖研,其中gradlew
是在Linux或Mac系統(tǒng)中使用的卿操,gradlew.bat
是在Windows系統(tǒng)中使用的。 -
local.properties:這個(gè)文件用于指定本機(jī)中的
Android SDK
路徑孙援,通常是自動(dòng)生產(chǎn)的害淤,我們并不需要修改。除非你本機(jī)中的Android SDK
位置發(fā)生了變化拓售,那么就將這個(gè)文件中的路徑修改成新的位置即可窥摄。 -
settings.gradle: 這個(gè)文件用于制定項(xiàng)目中所有引入的模塊。由于
Hello World
項(xiàng)目中只有一個(gè)app模塊础淤,因此該文件中也就只引入了app
這一個(gè)模塊崭放。通常下哨苛,模塊的引入是自動(dòng)完成的,需要我們手動(dòng)修改這個(gè)文件的場景可能比較少币砂。
app 目錄下的內(nèi)容分析
除app
目錄外其他都是自動(dòng)生成建峭。app
目錄下內(nèi)容是重點(diǎn)。
-
build: 和外層
build
目錄類似决摧,也包含了一些在編譯時(shí)自動(dòng)生成的文件亿蒸,不過它里面內(nèi)容更復(fù)雜,不需過多關(guān)心掌桩。 -
libs: 如項(xiàng)目使用了第三方
jar
包边锁,就需要存放在該目錄下。目錄下的jar
包會(huì)被自動(dòng)添加到項(xiàng)目的構(gòu)建路徑里波岛。 -
androidTest: 用來編寫
AndroidTest
測試用例砚蓬,可以對項(xiàng)目進(jìn)行自動(dòng)化測試。 -
java: 存放所有
Java
代碼(包括Kotlin
)盆色,展開該目錄,將看到系統(tǒng)幫我們自動(dòng)生成了一個(gè)MainActivity
文件祟剔。 -
AndroidManifest.xml: 整個(gè)
Android
項(xiàng)目的配置文件隔躲,可在程序中定義所有四大組件都需要在這個(gè)文件里注冊,還可以在這個(gè)文件里給應(yīng)用程序添加權(quán)限聲明物延。會(huì)經(jīng)常用到宣旱。 -
text: 用來編寫
UnitTest
測試用例的,是對項(xiàng)目進(jìn)行自動(dòng)化測試的另一種方式叛薯。 -
gitignore: 將
app
模塊內(nèi)指定的目錄或文件排除在版本控制之外浑吟,作用和外層的.gitignore
文件類似。 -
build.gradle: app模塊的
gradle
構(gòu)建腳本耗溜,會(huì)指定很多項(xiàng)目構(gòu)建相關(guān)的配置组力。 - proguard-rules.pro: 用于指定項(xiàng)目代碼的混淆規(guī)則,當(dāng)代碼開發(fā)完成打包成安裝包文件抖拴,如不希望代碼被破解燎字,通常會(huì)將代碼進(jìn)行混淆,從而讓破解者難以閱讀阿宅。
-
res: 項(xiàng)目中所使用到的所有圖片候衍,布局,字符串等資源洒放。該文件下還有很多子目錄蛉鹿。 圖片
drawable
、布局layout
往湿、字符串values
妖异。
res 目錄下的內(nèi)容分析
展開res
目錄如下惋戏。之所以有這么多mipmap
開頭的文件夾,其實(shí)主要是為了讓程序能夠更好地兼容各種設(shè)備随闺。在制作程序的時(shí)候最好能夠給同一張圖片提供幾個(gè)不同分辨率的版本日川,分別放在這些文件夾下,然后當(dāng)程序運(yùn)行的時(shí)候矩乐,會(huì)自動(dòng)根據(jù)當(dāng)前運(yùn)行設(shè)備分辨率的高低選擇加載哪個(gè)文件夾下的圖片龄句。
- 所有以
drawable
開頭的文件夾都是用來放圖片的 - 所有以
mipmap
開頭的文件夾都是用來放應(yīng)用圖標(biāo)的 - 所有以
values
開頭的文件夾都是用來放字符串、樣式散罕、顏色等配置的 -
layout
文件夾是用來放布局文件的
打開res/values/strings.xml
文件分歇,內(nèi)容如下所示:
<resources>
<string name="app_name">BoostTestAndroid</string>
</resources>
可以看到,這里定義了一個(gè)應(yīng)用程序名的字符串欧漱,我們有以下兩種方式來引用它职抡。
- 在代碼中通過
R.string.app_name
可以獲得該字符串的引用。 - 在XML中通過
@string/app_name
可以獲得該字符串的引用误甚。
修改應(yīng)用程序的名稱及圖標(biāo)缚甩。打開AndroidManifest.xml
文件,找到如下代碼:
// 圖標(biāo)
android:icon="@mipmap/ic_launcher"
// 應(yīng)用名稱
android:label="@string/app_name"
build.gradle文件
Android Studio
是采用Gradle
來構(gòu)建項(xiàng)目的窑邦。Gradle
是一個(gè)非常先進(jìn)的項(xiàng)目構(gòu)建工具擅威,它使用了一種基于Groovy
的領(lǐng)域特定語言(DSL
)來聲明項(xiàng)目設(shè)置,摒棄了傳統(tǒng)基于XML
(如Ant
和Maven
)的各種煩瑣配置冈钦。項(xiàng)目中有兩個(gè)build.gradle
文件郊丛,一個(gè)是在最外層目錄下的,一個(gè)是在app
目錄下的瞧筛。這兩個(gè)文件對構(gòu)建Android Studio
項(xiàng)目都起到了至關(guān)重要的作用厉熟。
app
目錄下的build.gradle
文件。這些代碼都是自動(dòng)生成的较幌,雖然語法結(jié)構(gòu)看上去可能有點(diǎn)難以理解揍瑟,但是如果我們忽略語法結(jié)構(gòu),只看最關(guān)鍵的部分绅络,其實(shí)還是很好懂的月培。第一行應(yīng)用了一個(gè)插件。一般可以選擇:1恩急、com.android.application
表示這是一個(gè)應(yīng)用程序模塊杉畜,2、com.android.library
表示這是一個(gè)庫模塊衷恭。兩者的最大區(qū)別是:一個(gè)是可以直接運(yùn)行的此叠;一個(gè)只能作為代碼庫依賴于別的應(yīng)用程序來運(yùn)行。
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
下面是一個(gè)Android
包随珠,用于配置項(xiàng)目構(gòu)建的各種屬性灭袁。
android {
namespace 'com.example.boosttestandroid'
compileSdk 32 // 用于指定項(xiàng)目的編譯版本
defaultConfig {// 對項(xiàng)目的更多細(xì)節(jié)進(jìn)行配置
applicationId "com.example.boosttestandroid" // 用于指定項(xiàng)目的包名
minSdk 21 // 用于指定項(xiàng)目最低兼容的Android系統(tǒng)版本
targetSdk 32 // 指定的值表示你在該目標(biāo)版本上已經(jīng)做過了充分的測試猬错,系統(tǒng)將會(huì)為你的應(yīng)用程序啟用一些最新的功能和特性
versionCode 1 // 指定項(xiàng)目的版本號
versionName "1.0" // 指定項(xiàng)目的版本名
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {// 用于指定生成安裝文件的相關(guān)配置
release {// 用于指定生成正式版安裝文件的配置
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
指定當(dāng)前項(xiàng)目所有的依賴關(guān)系.一般有三種依賴:本地依賴、庫依賴和遠(yuǎn)程依賴茸歧。
- 本地依賴可以對本地的
Jar
包或目錄添加依賴關(guān)系 - 庫依賴可以對項(xiàng)目中的庫模塊添加依賴關(guān)系
- 遠(yuǎn)程依賴則可以對
jcenter
庫上的開源項(xiàng)目添加依賴關(guān)系
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
三倦炒、解析默認(rèn) Demo
首先我們可以看到,MainActivity
是繼承自 AppCompatActivity
的软瞎。AppCompatActivity
是AndroidX
提供的一種向下兼容的Activity
逢唤,可以使Activity
在不同系統(tǒng)版本中的功能保持一致性。Activity
是Android
系統(tǒng)提供的一個(gè)活動(dòng)基類涤浇,我們項(xiàng)目中所有的活動(dòng)都必須繼承它或者它的子類才能擁有活動(dòng)的特性鳖藕。(AppCompatActivity
是Activity
的子類)。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
然后可以看到MainActivity
中有一個(gè)onCreate()
方法只锭,這個(gè)方法是一個(gè)活動(dòng)被創(chuàng)建時(shí)必定要執(zhí)行的方法著恩,其中只有兩行代碼,并且沒有Hello World!
的字樣蜻展。那么之前app
中顯示的Hello World!
是在哪里定義的呢喉誊?
其實(shí)Android
程序的設(shè)計(jì)講究邏輯和視圖分離,因此是不推薦在活動(dòng)中直接編寫界面的纵顾,更加通用的一種做法是裹驰,在布局文件中編寫界面,然后在活動(dòng)中引入進(jìn)來片挂。可以看到贞盯,在onCreate()
方法的第二行調(diào)用了setContentView()
方法音念,就是這個(gè)方法給當(dāng)前的活動(dòng)引入了一個(gè)activity_main
布局,那Hello World!
一定就是在這里定義的了躏敢!我們快打開這個(gè)文件看一看闷愤。
切換到text
視圖:
終于找到hello world
的定義了。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>