用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)

免责信息

本书内容为《第一行代码》第三版学习笔记,本文如有侵权请练习我。我会第一时间删除
欢迎学习讨论,转载请注明连接作者谢谢(鞠躬

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。