用Kotlin開發Android-第一章


1.簡介

1.1 系統架構

Android大概分為4層架構:

  • Linux內核層
    提供底層基本硬件驅動
  • 系統運行層
    通過C/C++提供數據庫、3D、瀏覽器等主要特性
  • 應用框架層
    提供構建應用程序所需API
  • 應用層
    手機上的應用程序

1.2 現行版本

主要以5.0在內以后的版本居多

1.3 開發特色

  1. 四大組件:Activity、Server、BordercastReceiver、ContentProvider
  2. 豐富的系統控件:可以自己定制
  3. SQLite數據庫:輕量級、運算速度快的數據庫,支持SQL語法
  4. 強大的多媒體

2. 開發環境

出問題問度娘,使用官方的AndroidStudio開發。


3. 第一個安卓項目

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


Android Menu

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

Project Menu

新版的IDE將目錄簡化了,所以開發起來會很快。剛開始學的時候不會很明白
下面對目錄中所有的內容進行講解

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 這個文件用于制定代碼項目的混淆規則,當代碼開發完成之后打包成軟件安裝包

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被創建時必須執行的方法。

然而我們發現,這個文件中沒有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

發現有很多mipmap開頭命名的文件夾,它們都是用來存放圖標的目錄。為了讓程序兼容各種設備,Drawable目錄中的文件也是一樣的道理。所以我們自己在開發的時候應該自己創建drawable-hdip、drawable-xhdpi、drawable-xxhdip。在作圖的時候把一個圖標準備多種分辨率。好麻煩大多數情況下就放在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的插件,后面的數字是插件的版本號。Kotlin插件的意思也差不多一樣,用Kotlin進行開發然后是版本號。如果使用的是Java開發就不需要聲明這個
除非像添加一些全局項目構建配置就不需要改動這個文件

接下來是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開發安卓,第一個是必用的。第二個是Kotlin擴展,在后續開發時會非常的方便。
然后是個Android閉包閉包中可以配置各種屬性,compileSdkVersion用于指頂項目的編譯版本,后續跟著的數字就對應指定版本。
android包里面有defaultConfig,這個閉包可以進行更多細節的配置。其中applicationId就是每一個應用的唯一標識符,不能重復,默認會使用我們創建項目時指定的包名。
minSdkVersion指定兼容的最低版本
targetSdkVersion+指定的值表示系統會根據最新系統指定新的特性
versionCode指定項目版本號
versionName指定項目的版本名
testInstrumentationRunner用于在當前項目中啟用JUnit測試

接下來看buildTypes閉包,這個閉包用于指定生成安裝文件的相關配置,通常會有兩個子閉包:debug和release。
debug很明顯能明白它的意思了,release用于指定生成正式版安裝文件的配置。debug可以忽略不寫的。其中release內的minifyEnabled用于指定是否對項目的的代碼進行混淆,t混淆,f不混淆。proguardFile執行混淆時使用的規則文件。這里指定了'proguard-android-optimize.txt'和 'proguard-rules.pro'

總而言之這部分內容有點長,不是很像寫

4 log工具

android.unit.log類中提供了5個方法打印日志
大概的使用方法

Log.d("MainActivity","onCreate execute");

第一個參數tag:一般傳入當前類名就好,主要用于隊打印信息進行過濾.
第二個參數: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)

免責信息

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373