用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阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335