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

开始启程,你的第一行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

关键字过滤
在这里插入图片描述
可以输入自己想要获取的某个关键字

猜你喜欢

转载自blog.csdn.net/pp520henni/article/details/120586830