《第一行代码》 第三版 - 第一章(笔记)

Posted 小柴的回忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《第一行代码》 第三版 - 第一章(笔记)相关的知识,希望对你有一定的参考价值。

开始启程,你的第一行android代码

1.Android的历史

2003年10月 - Andy Rubin等人创办了 Android公司
2005年8月, Google收购了Android
2008年,推出了Android系统的第一个版本
苹果认为Android剽窃了iPhone的创意,称要毁掉Android
2010年,Linux团将Android从Linux内核主线中除名
甲骨文公司以Android侵犯Java知识产权为由,对Google提起了诉讼
Android操作系统的源码免费开放,各家手机相继推出自己的Android系统手机
开放两年后,Android超过了诺基亚
现在Android已占据手机市场的70%

2.Android系统架构

2.1四层架构

Linux内核层

Android系统是基于Linux内核
为Android各种硬件提供底层的驱动

系统运行库层

通过C/C++库位Android系统提供主要的特性支持,例如SQLite库提供数据库的支持,OpenGL|ES库,提供3D绘画支持。等等
还有运行时库,主要提供一些核心库,允许开发者使用Java语言来编写Android。运行时库还包含着Dalvik虚拟机(5.0为ART运行环境)使得每个应用都能运行在单独的进程中,拥有自己的虚拟机。Dalvik和ART都是专门为移动设备定制的

应用框架层

主要提供各种API,Google提供的API

应用层

APP应用,就是属于这一层,自己开发的应用、短信、微信、QQ等APP就是属于应用层的

2.2五层框架

现在有一种五层架构的说法,在Linux内核层和系统运行库层中间有一个硬件抽象层

  • Linux内核层
  • 硬件抽象层
  • 系统运行库层
  • 应用框架层
  • 应用层

硬件抽象层

硬件抽象层,他是设备内核驱动的抽象接口,实现向更高级的JavaAPI框架提供访问底层设备的应用编程接口

3.Android应用开发的特色

3.1四大组件

  • Activity
  • Service
  • BroadcastReceiver
  • ContentProvider

3.2系统控件

系统拥有丰富的控件,让们轻松的写出自己好看的UI页面

3.3SQLite数据库

这是Android系统自带的轻量级数据块,特点,运算速度快,还支持标准的SQL语法

3.4 多媒体

提供了多媒体服务,如音乐、视频、录音、拍照等多媒体功能

4.配置开发环境

JDK

包含Java的运行环境、工具集合、基础库等内容

SDK

Google提供的Android开发工具包,开发时余姚引用该工具包来使用一些相关的AndroidAPI

Android Studio (后简称AS)

Google推出的一款IDE工具,很强大

小知识

Name:是羡慕的名称,即App编译后生成的名字
Package name:项目的报名,Android系统就是通过包名来区分不同的应用程序。
Save location:项目代码的保存位置
MinimumAPI Level:设置项目支持的最低版本

个人认为设定5.0版本(API21)既可,想兼容更多版本的话,也可以设定为4.0版本,但因为5.0一下版本的人都很少,而且兼容问题也很麻烦,建议还是选择5.0。

5.项目结构

5.1根目录结构

文件夹作用
.gradle和.ideaAS自动生成的文件,无需理会
app项目的代码、资源等都是放在此目录下
build编译时生成的文件,也无需过多关心
gradle包含了gralde wrapper 的配置文件,会根据本地缓存情况决定是否需要联网下载gradle。
.gitignore用于将置顶的目录或文件排除在版本控制之外。
build.gradle项目全局的gradle构建脚本,通常这个文件是不需要修改的
gradle.properties全局的gradle配置文件,这里配置的属性将影响到项目中所有的gradle编译脚本
gradlew和gradlew.bat这两个文件是用来在命令行界面中执行gradle命令的,其中前者是Linux和Mac系统中使用,gradlew.bat是在Windows系统中使用
HelloWorld.imliml文件是所有IEDA项目都会自动创建的一个文件(AS是基于IDEA的)
local.properties用于置顶本机的SDK路径,内容自动生成,不需要修改
settings.gradle用于指定项目中所有引入的模块,HelloWorld项目中只有一个app,所以值引入了app这一个模块。模块引入都是自动完成,手动修改的情况很少

5.2app目录结构

文件/文件夹作用
build和外层的bulid雷士,也是编译时自动生成的文件,内容更为复杂,但一样不需过多关心
libs项目用到的第三方jar包就是放在该目录下,此目录下的jar包会被自动添加到项目的构建路径里
androidTest用于编写AndroidTest测试用例,可进行自动化测试 (但我几乎没用过)
java显而易见,用于存放Java代码的地方(包括Kotlin)
res资源目录,项目所使用的图片,布局,字符,颜色表,风格等等都是放在这个目录下的,但不同内容会单独放在不通的子目录下
AndroidManifest.xmlAndroid项目的配置文件,四大组件的注册,权限的声明,等等
test用于编写Unit Test测试用例,对项目进行自动化测试的另一种方式。
.gitignore将app模块内制定的目录或文件排除在版本控制之外,和外层的类似
app.imlIDEA自动生成的文件
build.gradleapp模块的gradle构建脚本,会指定很多项目构建相关的配置
.proguard-rules.pro用于指定项目代码的混淆规则,开发玩后打包成安装包,如果不想被人破解,通常都进行代码混淆,让破解者难以阅读源码

5.3.项目运行的几个点

AndroidManifest.xml文件中对于Activity的注册,未注册是没法使用的(请看注释)

<activity android:name=".MainActivity">
            <intent-filter>
            	<!-- 两行代码的意思是,本App启动的第一个Activity是MainActivity -->
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

MainActivity:
AppCompatActivity是AndroidX中提供的一种向下兼容的Activity

class MainActivity : AppCompatActivity() {//继承AppCompatActivity
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //引用布局activity_main布局
        setContentView(R.layout.activity_main)
    }
}

Android将就逻辑和视图分离,所以不推荐Activity中编写界面,而是使用布局文件,然后在Activity中引用布局文件。

activity_main.xml :
在ConstraintLayout约束布局中,存在一个居中的TextView控件,而TextView控件就是用于显示"Hello World!"的

<?xml version="1.0" encoding="utf-8"?>
<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>

5.4 res目录结构

文件/文件名作用
drawable存放资源(图片、矢量图、背景图xml文件等)
layout顾名思义,是用于存放布局的
mipmap和drawable差不多,也是存放图片资源
values值文件,存放一些值的数据,如颜色值表,和字符串表
<resources>
    <string name="app_name">HelloWorld</string>
</resources>

5.5 application标签

在string.xml中的一个名为"app_name"的字符串
使用的方式有两种:
在xml中是通过@string/app_name引用
在代码中是通过R.string.app_name引用
下面的代码就是对字符串的引用,同时android:label属性是定义应用的名称
android:icon属性则是对图片的引用,同时他也是制定某张图片为本应用的图标


    <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/Theme.HelloWorld">
    </application>

5.6 build.gradle文件

AS采用的是Gradle来构建项目,它是一个非常先进的构建项目工具
最外层build.gradle

buildscript {
    ext.kotlin_version = "1.5.10"
    repositories { 
    	//分别对应其代码长仓库
        google()  //谷歌自家的扩展依赖仓库
        mavenCentral()
    }
    dependencies {
    	//gradle插件的版本,版本通常与AS版本号一致
        classpath "com.android.tools.build:gradle:4.2.2"
        //Kotlin插件的版本,Java项目不需要声明
        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() //与上边一致
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}

app目录下的build.gradle

plugins {
	//有两种选择,下方为应用程序模块,另一种是com.android.library,表示为库模块。区别在于,应用程序模块是可以直接运行的,而库模块笔记依附于应用程序模块才可以运行
    id 'com.android.application'
    //Kotlin开发必须
    id 'kotlin-android'
  
}

android {
    compileSdkVersion 30 //编译的版本
    buildToolsVersion "30.0.3" //项目构建工具的版本

    defaultConfig {
        applicationId "com.example.helloworld" //应用唯一标识符
        minSdkVersion 21 //最低兼容的版本
        targetSdkVersion 30 //表示你在该目标版本上已经做过了充分的测试,系统将会给你的应用启用一些改版本可以使用的一些特性与功能
        versionCode 1 //指定项目的版本号
        versionName "1.0" //指定项目的版本名
		//用于当前项目中启用JUnit测试,你可以为当前项目编写测试
		//当前项目中启动JUnit测试。可编写测试用例
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {//用于指定生成安装文件的相关配置
        release {//用于指定生成正式版安装文件的配置
            minifyEnabled false//是否对项目的代码进行混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' //用于指定混淆时使用的规则文件
            //第一个是<SDK>/tools/proguard目录下的,所有项目通用的混淆规则,第二个是当前项目的根目录,可以编写当前项目特有的混淆规则
        }
        //用于指定测试版安装文件的配置
        debug{
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies { //指定当前项目的所有依赖关系,共有3种依赖方式:本地依赖,库依赖,远程依赖。
	//本地依赖方式,implementation fileTree就是本地依赖声明,libs目录下的所有.jar后缀文件都添加到项目的构建路径中。
	implementation fileTree(dir: 'libs', include:['*.jar'])
	// implementation是远程依赖的声明
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.1'
    //如 androidx.appcompat为域名部分,用于区分不同公司的库,appcompat为工程名,而1.2.0则是版本号,
    // Gradle在构建项目时会首先检查一下本地是否有该库缓存,没有就会自动联网下载,然后添加
    implementation 'androidx.appcompat:appcompat:1.2.0'
    //库依赖的用法:库模块名称为helper
    //implementation project(':helper')
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
依赖方式用法
本地依赖对本地的jar包或者目录添加依赖关系
库依赖可以对项目中的库模块添加依赖关系
远程依赖远程依赖则可以对开源仓库上的开源项目添加依赖关系

6.日志的使用

6.1 Log

Android的日志工具类为Log

用法级别作用
Log,v()verbose用于打印最为琐碎,意义最小的日志,级别最低
Log.d()debug比verbose高一级,用于打印一些调试信息
Log.i()info打印一些比较重要的信息,比debug高一级
Log.w()warn打印一些警告信息,提示程序在这地方可能存在危险,比info高一级
Log.e()error打印错误信息,级别最高,比warn高一级

用法:Log.d(tag, msg);
tag用于过滤日志,而msg才是你想要输出的内容

6.2 Log和println()的区别

学过Java都知道System.out.println()可以输出日志,但在Android中,是并不建议这样做的,因为使用它的话,日志开关不可以控制,不能添加日志标签、日志没有级别区分…

6.3 LogCat

过滤器

名称作用
Show only selected application只显示当前选中程序的日志
Firebase开发者工具和基础架构平台,不需理
No Filters全部打印,不过滤
Edit Filter Configuration自定义过滤器

通过Edit Filter Configuration编辑自定义过滤器
小柴的回忆 为自定义过滤器,而这个自定义过滤器,只显示TAG名为 小柴的回忆的日志

级别控制

过滤自己想要的日志

  • Verbose
  • Debug
  • Info
  • Warn
  • Error
  • Assert

关键字过滤

可以输入自己想要获取的某个关键字

学习时间:

提示:这里可以添加计划学习的时间
例如:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点


学习产出:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个
;

以上是关于《第一行代码》 第三版 - 第一章(笔记)的主要内容,如果未能解决你的问题,请参考以下文章

《第一行代码》 第三版 - 第四章(笔记)

《第一行代码》 第三版 - 第二章(笔记)

Android 学习之《第一行代码》第三版 笔记Kotlin 继承时的括号到底写不写

数字图像处理 第三版 第一章笔记

《构建之法》(第三版)——邹欣 读书笔记

《构建之法(第三版)》第一章