《第一行代码》 第三版 - 第一章(笔记)
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和.idea | AS自动生成的文件,无需理会 |
app | 项目的代码、资源等都是放在此目录下 |
build | 编译时生成的文件,也无需过多关心 |
gradle | 包含了gralde wrapper 的配置文件,会根据本地缓存情况决定是否需要联网下载gradle。 |
.gitignore | 用于将置顶的目录或文件排除在版本控制之外。 |
build.gradle | 项目全局的gradle构建脚本,通常这个文件是不需要修改的 |
gradle.properties | 全局的gradle配置文件,这里配置的属性将影响到项目中所有的gradle编译脚本 |
gradlew和gradlew.bat | 这两个文件是用来在命令行界面中执行gradle命令的,其中前者是Linux和Mac系统中使用,gradlew.bat是在Windows系统中使用 |
HelloWorld.iml | iml文件是所有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.xml | Android项目的配置文件,四大组件的注册,权限的声明,等等 |
test | 用于编写Unit Test测试用例,对项目进行自动化测试的另一种方式。 |
.gitignore | 将app模块内制定的目录或文件排除在版本控制之外,和外层的类似 |
app.iml | IDEA自动生成的文件 |
build.gradle | app模块的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 个
;
以上是关于《第一行代码》 第三版 - 第一章(笔记)的主要内容,如果未能解决你的问题,请参考以下文章