读后感-Android第一行代码第二版(1)

前言

郭神出品,必属精品,记得在刚做Android开发的时候,当时买了Android第一行代码第一版,看了之后感觉内容通俗易懂,收获颇多,当时还不知道作者是郭神,后来在CSDN上看了很多他写的文章,发现原来作者就是郭神,现在他出了第二版,果断将书买了回来,书很早就看完了,今天将书籍翻了出来看了一下,决定将自己的想法给记录一下.

第一章 开始启程—你的第一行Android代码

1.1 了解全貌——Android王国介绍

1.1.1 Android系统架构

Android系统架构大致可分为4层:

  1. Linux内核层
  • Android系统是基于Linux内核的,这一层主要为Android设备提供了底层的驱动,如, 显示驱动,音频驱动,照相机驱动,蓝牙驱动,Wi-Fi驱动,电源管理等
  1. 系统运行库层
  • 这一层通过一些C/C++库来为Android系统提供了主要的特性支持,如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供了浏览器内核的支持等.
  • 同样在这一层还有Android运行时库,它主要提供了一些核心库,能够允许开发者使用Java语言来编写Android应用.另外,Android运行时库中还包含了Dalvik虚拟机(5.0系统之后改为ART运行环境),它使得每一个 Android应用都能运行在独立的进程当中,并且拥有自己的一个Dalvik虚拟机实例.相较于Java虚拟机.Davik是专门为移动设备定制的,它针对手机内存,CPU性能有限等情况做了优化处理.
  1. 应用框架层
  • 这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者亦可以通过使用这些API来构建自己的应用程序.
  1. 应用层
  • 所有安装在手机世联行的应用程序都是属于这一层的,比如系统自带的联系人,短信等程序,或者是你从Google Play上下载的小游戏,当然还包括你自己开发的程序.

结合下图你将会理解更加深刻

《读后感-Android第一行代码第二版(1)》 Android系统架构

1.1.2 Android已发布的版本
  • Android操作系统是一个由Google开放手持设备联盟共同开发发展的移动设备操作系统,其最早的一个版本Android 1.0 beta发布于2007年11月5日,至今已经发布了多个更新。这些更新版本都在前一个版本的基础上修复了Bug并且添加了前一个版本所没有的新功能。
  • 从2009年5月开始,Android操作系统改用甜点来作为版本代号,这些版本按照从C大写字母开始的顺序来进行命名:纸杯蛋糕(Cupcake)、甜甜圈(Donut)、闪电泡芙(Éclair)、冻酸奶(Froyo)、姜饼(Gingerbread)、蜂巢(Honeycomb)﹑冰淇淋三明治(Ice Cream Sandwich)、果冻豆(Jelly Bean)、奇巧(KitKat)、棒棒糖(Lollipop)、棉花糖(Marshmallow)、牛轧糖(Nougat)、奥利奥(Oreo)。
  • Android在正式发行之前,最开始拥有两个内部测试版本,并且以著名的机器人名称来对其进行命名,它们分别是:铁臂阿童木(Astro Boy,注意不是Astro阿童木)和发条机器人(Bender)。需要注意的是,Android 1.0和1.1的版本代号并不是这两个,维基百科中的“Android Version History”词条部分是错误的。 [3]
  • 后来由于涉及到版权问题,谷歌将其命名规则变更为用甜点作为它们系统版本的代号的命名方法。Android 1.0是于2008年9月23日正式发布的Android第一版,Android 1.1发布于2009年2月2日,但其实谷歌内部有更多的1.1版的变种。甜点命名法开始于第三版Android 1.5(实际上是第四版,因为Android 1.0其实有两版)。而从Android 1.6 Donut甜甜圈开始,项目组才正式确定将Android开发代号首字母从“C”一直延续下去。值得一提的是,Android 1.1 的内部代号为 Petit Four ,但项目主管喜欢美味的点心,最终结束了这种命名方式。

所以Astro BoyBender都是真实的,但他们都是在超早期的里程碑版本中进行的,完整的时间表是这样的:

  • Android milestone builds (with Astro Boy and Bender floating around in here somewhere)

  • Android 1.0(没有开发代号)

  • Android 1.1 – Petit Four

  • Android 1.5 – Cupcake

  • Android 1.6 – Donut

  • Android 2.0/2.1 – Éclair

  • Android 2.2 – Froyo

  • Android 2.3 – Gingerbread

  • Android 3.0/3.1/3.2 – Honeycomb

  • Android 4.0 – Ice Cream Sandwich

  • Android 4.1/4.2/4.3 – Jelly Bean

  • Android 4.4 – KitKat

  • Android 5.0/5.1 – Lollipop(Android L)

  • Android 6.0 – Marshmallow(Android M)

  • Android 7.0 -Nougat(Android N)

  • Android 8.0 -Oreo(Android O)

随着版本的更迭,应用程序编程接口(API)等级不断发生。下面将目前为止所有API等级罗列出来,并与Android各版本一一对应。
API等级1:Android 1.0
API等级2:Android 1.1 Petit Four
API等级3:Android 1.5 Cupcake
API等级4:Android 1.6 Donut
API等级5:Android 2.0 Éclair
API等级6:Android 2.0.1 Éclair
API等级7:Android 2.1 Éclair
API等级8:Android 2.2 – 2.2.3 Froyo
API等级9:Android 2.3 – 2.3.2 Gingerbread
API等级10:Android 2.3.3-2.3.7 Gingerbread
API等级11:Android 3.0 Honeycomb
API等级12:Android 3.1 Honeycomb
API等级13:Android 3.2 Honeycomb
API等级14:Android 4.0 – 4.0.2 Ice Cream Sandwich
API等级15:Android 4.0.3 – 4.0.4 Ice Cream Sandwich
API等级16:Android 4.1 Jelly Bean
API等级17:Android 4.2 Jelly Bean
API等级18:Android 4.3 Jelly Bean
API等级19:Android 4.4 KitKat
API等级20:Android 4.4W
API等级21:Android 5.0 Lollipop
API等级22:Android 5.1 Lollipop
API等级23:Android 6.0 Marshmallow
API等级24:Android 7.0 Nougat
API等级25:Android 7.1 Nougat
API等级26:Android 8.0 Oreo

1.1.3 Android应用开发特色
  1. 四大组件
  • Android四大组件分别是活动(Activity),服务(Service),广播接收器(Broadcast Receiver)和内容提供器(Content Provider).其中活动是所有Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的,而服务就比较低调了.你无法看到它,但它会一直在后台默默地运行,即使用户退出了应用,服务仍然可以继续的运行的.广播接收器允许你的应用接收来自各处的广播消息,比如电话,短信等,当然你的应用同样也可以向外发出广播消息.内容提供器则为应用程序之间共享数据提供了可能,比如你想要读取系统电话簿中的联系人,就需要通过内容提供器来实现.
  1. 丰富的系统控件
  • Andriod系统为开发者提供了丰富的系统控件,使得我们可以很轻松地编写出漂亮的界面.当然如果你品位比较高,不满足系统自带的控件效果,也完全可以定制属于自己的控件.
  1. SQLite数据库
  • Android系统自带了这种轻量级,运算速度极快的嵌入式关系型数据库, 它不仅支持标准的SQL语法,还可以通过Android封装好的API进行操作,让存储和读取数据变得非常方便
  1. 强大的多媒体
  • Android系统还提供了丰富的多媒体服务.如音乐,视频,录音,拍照,闹铃,等等,这一切你可以在程序中通过代码进行控制,让你的应用变得更加丰富多彩.
  1. 地理位置定位
    移动设备和PC相比起来,地理位置定位功能应该可以算是很大的一个亮点,现在的Android手机都内置了GPS,走到哪儿都可以定位自己的位置,发挥你的想象就可以做出创意十足的应用,如果在结合功能强大的地图功能,LBS这一领域潜力无限.

1.2 手把手带你搭建开发环境

1.2.1 准备所需要的工具
  • JDK
  • Android SDK
  • Android Studio
1.2.1 搭建开发环境
  • Android Studio的安装过程

1.3 创建你的第一个Android项目

任何一个编程语言的第一个程序毫无疑问都会是Hello World,这已经是20世纪70年代一直流传下来的传统,在编程界已成为永恒的经典.

1.3.1 创建HelloWorld项目
1.3.2 启动模拟器
1.3.3 运行HelloWorld
1.3.4 分析你的第一个Android程序

这里我们将项目结构模式切换成Project,这就是项目的真实目录结构

《读后感-Android第一行代码第二版(1)》 Project模式的项目结构

  1. .gradle和.idea
    这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去手动编辑.
  2. app
    项目中的代码,资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的,待会儿还会对这个目录单独展开进行讲解.
  3. build
    它主要包含了一些编译时自动生成的文件
  4. gradle
    这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle.Android Studio默认没有启用gradle wrapper的方式,如果需要打开,可以点击Android Studio导航栏–>File–>Settings–>Build,Execution,Deployment–>Gradle,进行配置更改.
  5. .gitignore
    这个文件是用来将指定的文件排除在版本控制之外的.
  6. build.gradle
    这是项目全局的gradle构建脚本,通常这个文件中的内容是不需要修改的.
  7. gradle.properties
    这个文件是全局的gradle配置文件, 在这里配置的属性将会影响到项目中所有的gradle编译脚本.
    8, gradlew和gradlew.bat
    这两个文件是用来命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows中使用的.
  8. HelloWorld.iml
    img文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,我们不需要修改这个文件中的任何内容.
  9. local.properties
    这个文件用于指定Android SDK路径,通常内容都是自动生成的,我们并不需要修改,除非你本机中的Android SDK位置发生了变化 ,那么就将这个文件中的路径改成新的位置即可.
  10. settings.gradle
    这个文件用于指定项目中所有引入的模块,由于HelloWorld项目中就只有一个app模块,因此这个文件中也就只引入了一个模块,通常情况下模块的引入都是自动完成的,需要我们手动去修改这个文件的场景可能表较少

app目录, 如图:

《读后感-Android第一行代码第二版(1)》 app目录下的结构

那么下面我们就来对app目录下的内容进行更为详细的分析

  1. build
    这个目录和 外层的build目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容更多更杂,我们不需要过多关心
  2. libs
    如果你的项目中使用到了第三方jar包,就需要把这些jar包都放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去
  3. androidTest
    此处是用来编写Android Test测试用例的.可以对项目进行一些自动化测试
  4. java
    毫无疑问,java目录是放置我们所有Java代码的地方,展开该目录,你将看到我们刚才创建的HelloWorldActivity文件就在里面
  5. res
    项目中使用到的所有图片,布局,字符串等资源都要存放在这个目录下.当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的.
    6, Androidmanifest.xml
    这是你整个Android项目的配置文件,你在程序中定义的四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用添加权限声明,由于这个文件以后会进场用到,我们用到的时候再做详细说明.
  6. test
    此处是用来编写Unit Test测试用例的. 是对项目进行自动化测试的另一种方式.
  7. .gitigmore
    这个文件用于将app模块内的指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似
  8. app.iml
    IntelliJ IDEA项目自动生成的文件, 我们不需要关心或修改这个文件中的内容
  9. build.gradle
    这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置,我们稍后将会详细分析gradle构建脚本中的具体内容
  10. proguard-rules.pro
    这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读.
1.3.5 详解项目中的资源

《读后感-Android第一行代码第二版(1)》 res目录下的结构

  1. 所有以drawable开头的文件夹都是用来放图片的,所有以mipmap开头的文件夹都是用来放应用图标的,所有以values开头的文件夹都是用来放字符串,样式,颜色等配置的,layout文件夹是用来放布局文件的.

  2. 之所以这么多mipmap开头的文件夹,其实主要是为了让程序能够更好地兼容各种设备.drawable文件夹也是同样的道理

  3. drawable-v24和mipmap-anydpi-v26是为了适配Android8.0系统应用图标而自动生成的

  4. 打开values/string.xml,内容如下

     <resources>
     <string name="app_name">HelloWorld</string>
     </resources>
    

可以看到, 这里定义了一个应用程序名的字符串,我们有以下两种方式来引用它.

  • 在代码中通过R.string.app_name可以获得该字符串的引用.
  • 在XML中通过@string/app_name可以获得该字符串的引用.
  1. 打开AndroidManifest.xml文件,找到如下代码:

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

其中,HelloWorld项目的应用图标就是通过android:icon属性来指定的,应用的名称则是通过android:label属性指定的.可以看到,这里对资源引用的方式正式我们刚刚学过的在XML中引用资源的语法.

1.3.6 详解build.gradle文件
  1. 先来看下外层目录下build.gradle文件,代码如下所示:

    buildscript {
     repositories {
     google()
     jcenter()
     }
     dependencies {
     classpath 'com.android.tools.build:gradle:3.0.1'
     
     // NOTE: Do not place your application dependencies here; they belong
     // in the individual module build.gradle files
     }
     }
     allprojects {
     repositories {
     google()
     jcenter()
     }
     }
    
     task clean(type: Delete) {
     delete rootProject.buildDir
     }
    
  • repositories的闭包中都声明了 google(),jcenter()这两个配置,那么这个jcenter和google是什么意思呢?其实它们是一个代码托管仓库,很多Android开源项目选择将代码托管到jcenter和google上,声明了这些配置后,我们就可以在项目中引用任何jcenter和google上的开源项目了.
  • dependencies闭包中使用Classpath声明了一个Gradle插件,为什么要声明这个插件呢?因为Gradle并不是在专门为构建Android项目而开发的,Java,C++等很多中项目都可以使用Gradle来构建,因此如果要构建Android项目,则需要声明 classpath ‘com.android.tools.build:gradle:3.0.1’这个插件,其中,最后面的部分是版本号.
  1. app目录下的build.gradle文件

     apply plugin: 'com.android.application'
    
     android {
     compileSdkVersion 26
     defaultConfig {
     applicationId "com.dream.helloworld"
     minSdkVersion 19
     targetSdkVersion 26
     versionCode 1
     versionName "1.0"
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
     buildTypes {
     release {
         minifyEnabled false
         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
     }
     }
     }
    
     dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
     implementation 'com.android.support:appcompat-v7:26.1.0'
     implementation 'com.android.support.constraint:constraint-layout:1.1.0'
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
     }
    
  • 这个文件中的内容相对复杂一些,com.android.application表示这是一个应用程序模块,com.android.library表示这是一个库.
  • android闭包,compileSdkVersion用于指定项目的编译版本
  • defaultConfig闭包,applicationId用于指定项目的包名,minSdkVersion用于指定项目最低兼容的Android系统版本,targetSdkVersion指定的值表示你在改在该目标版本上已经做过了充分的测试,versionCode用于指定版本号,versionName用户指定版本名称
  • buildTypes闭包,用于指定生成安装文件的相关配置,通常会有两个子闭包,一个是debug,一个是release,debug闭包是可以忽略不写的,因此上面的代码中只有一个release闭包.minifyEnabled用于是否开启混淆,为true表示开启混淆,为false表示不混淆.
  • dependencies闭包,这个闭包功能非常强大,它可以指定当前项目所有的依赖关系,通常Android Studio项目一共有3中依赖方式:本地依赖,库依赖,远程依赖.第一行的 implementation fileTree(dir: ‘libs’, include: [‘*.jar’])就是一个本地依赖,而第二行的 implementation ‘com.android.support:appcompat-v7:26.1.0’就是一个远程依赖,像compile project这种的就是库依赖.testImplementation ‘junit:junit:4.12’是用来声明测试用例库的.

1.4 前行必备——掌握日志工具的使用

  • Log.v(); 对应级别verbose,是Android日志里面级别最低的那一种
  • Log.d(); 对应级别debug,比verbose高一级
  • Log.i(); 对应级别info,比debug高一级
  • Log.w();对应级别warn,比info高一级
  • Log.e(); 对应级别error,比warn高一级

logcat中还能使用和添加过滤器

1.5 小结

以上就是Android第一行代码第一章的全部内容,书中写的比较细致,很全面,同时收货也很多.

    原文作者:妖孽那里逃
    原文地址: https://www.jianshu.com/p/13a65f053886
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞