用Kotlin開發(fā)Android-第一章


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ā)特色

  1. 四大組件:Activity投蝉、Server偏竟、BordercastReceiver取试、ContentProvider
  2. 豐富的系統(tǒng)控件:可以自己定制
  3. SQLite數(shù)據(jù)庫:輕量級、運算速度快的數(shù)據(jù)庫穗酥,支持SQL語法
  4. 強大的多媒體

2. 開發(fā)環(huán)境

出問題問度娘,使用官方的AndroidStudio開發(fā)。


3. 第一個安卓項目

當你打開MyApplication項目會看到這樣字的目錄


Android Menu

但實際上的目錄需要把Android換成Project

Project Menu

新版的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目錄

res Menu

發(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-androidkotlin-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)

免責信息

本書內容為《第一行代碼》第三版學習筆記,本文如有侵權請練習我讥蟆。我會第一時間刪除
歡迎學習討論勒虾,轉載請注明連接作者謝謝(鞠躬

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘸彤,隨后出現(xiàn)的幾起案子修然,更是在濱河造成了極大的恐慌,老刑警劉巖质况,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愕宋,死亡現(xiàn)場離奇詭異,居然都是意外死亡结榄,警方通過查閱死者的電腦和手機中贝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臼朗,“玉大人邻寿,你說我怎么就攤上這事蝎土。” “怎么了绣否?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵誊涯,是天一觀的道長。 經常有香客問我蒜撮,道長暴构,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任淀弹,我火速辦了婚禮丹壕,結果婚禮上庆械,老公的妹妹穿的比我還像新娘薇溃。我一直安慰自己,他們只是感情好缭乘,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布沐序。 她就那樣靜靜地躺著,像睡著了一般堕绩。 火紅的嫁衣襯著肌膚如雪策幼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天奴紧,我揣著相機與錄音特姐,去河邊找鬼。 笑死黍氮,一個胖子當著我的面吹牛唐含,可吹牛的內容都是我干的。 我是一名探鬼主播沫浆,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捷枯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了专执?” 一聲冷哼從身側響起淮捆,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎本股,沒想到半個月后攀痊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拄显,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年苟径,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凿叠。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涩笤,死狀恐怖嚼吞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蹬碧,我是刑警寧澤舱禽,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站恩沽,受9級特大地震影響誊稚,放射性物質發(fā)生泄漏。R本人自食惡果不足惜罗心,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一里伯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渤闷,春花似錦疾瓮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弦蹂,卻和暖如春肩碟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凸椿。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工削祈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脑漫。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓髓抑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窿撬。 傳聞我的和親對象是個殘疾皇子启昧,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354