1.簡介
1.1 系統(tǒng)架構
Android大概分為4層架構:
- Linux內核層
提供底層基本硬件驅動- 系統(tǒng)運行層
通過C/C++提供數(shù)據(jù)庫、3D概页、瀏覽器等主要特性- 應用框架層
提供構建應用程序所需API- 應用層
手機上的應用程序
1.2 現(xiàn)行版本
主要以5.0在內以后的版本居多
1.3 開發(fā)特色
- 四大組件:Activity投蝉、Server偏竟、BordercastReceiver取试、ContentProvider
- 豐富的系統(tǒng)控件:可以自己定制
- SQLite數(shù)據(jù)庫:輕量級、運算速度快的數(shù)據(jù)庫穗酥,支持SQL語法
- 強大的多媒體
2. 開發(fā)環(huán)境
出問題問度娘,使用官方的AndroidStudio開發(fā)。
3. 第一個安卓項目
當你打開MyApplication項目會看到這樣字的目錄
但實際上的目錄需要把Android換成Project
新版的IDE將目錄簡化了砾跃,所以開發(fā)起來會很快骏啰。剛開始學的時候不會很明白
下面對目錄中所有的內容進行講解
3.1 項目外層目錄
文件名 | 解釋 |
---|---|
.grand/.idea | AS自動生成的文件 |
app | 項目中的代碼、資源 |
build | 編譯時自動生成的文件 |
gradle | 包含了Gradle wrapper文件安裝后沒有需要手動下載 |
.gitigonore | 用來將指定目錄或文件排除在版本控制之外 |
build.grade | 項目布局的gradle構建腳本 |
gradle.properties | gradle配置文件 |
HelloWorld.iml | 所有的IntelliJ IDEA都會生成的文件 |
setting.gradle | 用于指頂項目中所有引用的模塊 |
3.2 app目錄
文件名 | 解釋 |
---|---|
build | 這個目錄和外層的build類似抽高,但是文件更多 |
libs | 如果項目中有第三方jar包判耕,就要把jar包放到這里,jar包會被自動添加到項目中 |
androidTest | 可以對項目自動化測試 |
res | 項目中的圖片翘骂、布局壁熄、字符串資源都在這里,這里也可以添加權限聲明 |
test | 編寫UnitTest用碳竟,對項目進行自動化測試的另一種方式 |
.gitigonre | 用于將app模塊內指定目錄或文件排除在版本控制之外请毛,和外層的.gitignore類似 |
app.iml | IDE自動生成的文件 |
build.gradle | 是app獲取模塊的腳本,這個文件中會制指定很多項目構建相關配置 |
proguard-rules.pro | 這個文件用于制定代碼項目的混淆規(guī)則瞭亮,當代碼開發(fā)完成之后打包成軟件安裝包 |
3.3 HelloWorld是如何運行的
打開Android-Mainfest.xml
文件方仿,可以看到
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
這段代碼對MainActivity進行注冊,沒有在這個文件中注冊的Activity是不能用的统翩。其中<intent-filter>
包含的代碼很重要仙蚜,<action ...>
,<category ...>
表示MainActively是這個項目的主Activity,在手機上點擊圖標啟動的就是這個厂汗。
Activity委粉,凡是顯示在應用界面內的東西都是Activity里的,注冊看完了那就去看一看MainActivity.kt
的代碼
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
首先娶桦,MainActivity繼承自AppCompatActivity贾节,AppCompatActivity是AndroidX提供的一種向下兼容的Activity,可以讓Activity在不同版本中保持一致的功能衷畦。Activity是Android提供的一個基類栗涂,所有自定義Activity只有繼承它或者它的子類才能獲得Activity的特性,而AppCompatActivity是Activity的一個子類祈争。
再往下看斤程,我們會看到一個onCreate()
方法,這個方法是Activity被創(chuàng)建時必須執(zhí)行的方法菩混。
然而我們發(fā)現(xiàn)忿墅,這個文件中沒有HelloWord,HelloWorld在哪里呢沮峡?
在布局文件res/layout/activity_main.xml
這個文件中疚脐。因為這里的布局文件和Activity是分開的,在布局中邊界界面邢疙,然后在Activity中引入棍弄。
<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_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
布局代碼中望薄,中間有個<TextView ... />
這個是用來顯示文字的控件。在這些代碼中照卦,我們終于看到了HelloWorld
找個HelloWorld都這么費勁
3.4 詳解項目中的資源
打開res目錄
發(fā)現(xiàn)有很多mipmap開頭命名的文件夾式矫,它們都是用來存放圖標的目錄乡摹。為了讓程序兼容各種設備役耕,Drawable目錄中的文件也是一樣的道理。所以我們自己在開發(fā)的時候應該自己創(chuàng)建drawable-hdip聪廉、drawable-xhdpi瞬痘、drawable-xxhdip。在作圖的時候把一個圖標準備多種分辨率板熊。好麻煩大多數(shù)情況下就放在drawable-xxhdip目錄下就行啦框全。
3.5 使用這些資源-修改圖標
打開res/values/strngs.xml
文件
<resources>
<string name="app_name">My Application</string>
</resources>
helloword這個初始項目中只有這三行代碼,這里看到<string ...>
中包含的My Application就是我們的項目名稱干签。有以下兩種方式去引用它們:
- 在代碼中通過
R.tring.app_name
可以獲得該字符串的引用 - 在XML中通過
@string/app_name
可以獲得該字符串的引用
其中string是可以替換的津辩,圖片就替換成drawable,圖標就替換成mipmap容劳,引用的布局文件可以換成layout喘沿。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
</application>
在AndroidManifest.xml文件,找到<application>
中包裹的代碼竭贩。HelloWorld的項目應用圖標就是通過android:icon
屬性指定的
3.6 build.gradle文件
因為AS是使用gradle來構建項目蚜印,我們有兩個build.geadle文件,一個在外層目錄下留量、一個在app目錄中窄赋。
先來看看外層目錄下的build.gradle
buildscript {
ext.kotlin_version = "1.4.0"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
這些代碼是自動生成的,其中兩處repositories閉包中都聲明了google()
和jcenter()
這兩行進行配置楼熄。這兩個包都對應一個代碼倉庫忆绰,google倉庫就是他們自家的擴展依賴,jecnter是第三方的開源庫可岂,聲明之后就可以在項目中使用了较木。
dependencies閉包使用的classpath聲明了兩個插件:gradle插件和kotlin插件,因為如果要構建Android項目需要找到gradle專門用來構建Android的插件青柄,后面的數(shù)字是插件的版本號伐债。Kotlin插件的意思也差不多一樣,用Kotlin進行開發(fā)然后是版本號致开。如果使用的是Java開發(fā)就不需要聲明這個
除非像添加一些全局項目構建配置就不需要改動這個文件
接下來是app目錄下的build.gradel文件峰锁,代碼如下:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
第一行應用了一個插件,一般有兩種值可選
- com.android.applaction 表示這是一個應用程序模塊双戳,可以直接運行
- com.android.library 表示這是一個庫模塊虹蒋,只能作為代碼庫運行
接下來兩行應用了kotlin-android
和kotlin-android-extentions
兩個插件。如果用kotlin開發(fā)安卓,第一個是必用的魄衅。第二個是Kotlin擴展峭竣,在后續(xù)開發(fā)時會非常的方便。
然后是個Android閉包閉包中可以配置各種屬性晃虫,compileSdkVersion
用于指頂項目的編譯版本皆撩,后續(xù)跟著的數(shù)字就對應指定版本。
android包里面有defaultConfig
哲银,這個閉包可以進行更多細節(jié)的配置扛吞。其中applicationId
就是每一個應用的唯一標識符,不能重復荆责,默認會使用我們創(chuàng)建項目時指定的包名滥比。
minSdkVersion
指定兼容的最低版本
targetSdkVersion
+指定的值表示系統(tǒng)會根據(jù)最新系統(tǒng)指定新的特性
versionCode
指定項目版本號
versionName
指定項目的版本名
testInstrumentationRunner
用于在當前項目中啟用JUnit測試
接下來看buildTypes
閉包,這個閉包用于指定生成安裝文件的相關配置做院,通常會有兩個子閉包:debug和release盲泛。
debug很明顯能明白它的意思了,release用于指定生成正式版安裝文件的配置键耕。debug可以忽略不寫的寺滚。其中release內的minifyEnabled用于指定是否對項目的的代碼進行混淆,t混淆郁竟,f不混淆玛迄。proguardFile執(zhí)行混淆時使用的規(guī)則文件。這里指定了'proguard-android-optimize.txt'和 'proguard-rules.pro'
總而言之這部分內容有點長棚亩,不是很像寫
4 log工具
android.unit.log類中提供了5個方法打印日志
大概的使用方法
Log.d("MainActivity","onCreate execute");
第一個參數(shù)tag:一般傳入當前類名就好,主要用于隊打印信息進行過濾.
第二個參數(shù):msg,具體想打印的內容
function | trans |
---|---|
Log.v() | 打印最瑣碎的日志 |
Log.d() | 打印調試信息 |
Log.i() | 打印重要信息 |
Log.w() | 打印警告信息 |
Log.e() | 打印錯誤信息 |
4.1 在hello World中添加log工具
打開hello World的MainActivity蓖议,在onCreate方法中添加一行打印日志語句:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("MainActivity","onCreated execute")
}
運行之后在log cat中會看到一些日志信息
2020-09-17 10:58:01.559 8491-8533/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe17040c0: ver 2 0 (tinfo 0xe1703290)
2020-09-17 10:58:01.622 8491-8533/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe17040c0: ver 2 0 (tinfo 0xe1703290)
2020-09-17 10:58:01.742 8491-8533/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe17040c0: ver 2 0 (tinfo 0xe1703290)
免責信息
本書內容為《第一行代碼》第三版學習筆記,本文如有侵權請練習我讥蟆。我會第一時間刪除
歡迎學習討論勒虾,轉載請注明連接作者謝謝(鞠躬