第一章
Android的系统架构有四层:Linux内核层、系统运⾏库
层、应⽤框架层和应⽤层
Linux内核层:Android系统是基于Linux内核的,这⼀层为Android设备的各种硬件提供了底层的驱动
系统运⾏库层
这⼀层通过⼀些C/C++库为Android系统提供了主要的特性⽀持。
应⽤框架层
这⼀层主要提供了构建应⽤程序时可能⽤到的各种API。
应⽤层
所有安装在⼿机上的应⽤程序都是属于这⼀层的
Android已发布的版本
2008年9⽉,Google正式发布了Android 1.0系统,这也是Android系统最早的版本。
2014年Google推出了号称史上版本改动最⼤的Android 5.0系统,使⽤ART运⾏环境替代了 Dalvik虚拟机,⼤⼤提升了应⽤的运⾏速度,还提出Material Design的概念来优化应⽤的界⾯设计。除此之外,还推出了Android Wear、Android Auto、Android TV系统。
Android系统版本及其详细信息,可以通过访问http://developer.android.google.cn/about/dashboards。
Android系统提供的优秀应用程序
- 四大组件
Android系统四⼤组件分别是Activity、Service、BroadcastReceiver 和ContentProvider。其中Activity是所有Android应⽤程序的门⾯,
凡是在应⽤中你看得到的东⻄,都是放在Activity中的。
Service你⽆法看到它,是在后台默默地运⾏,即使⽤户退出了应⽤,Service仍然是可以继续运⾏的。BroadcastReceiver允许你的应⽤接收来⾃各处的⼴播消息,也可以向外发出⼴播消息。ContentProvider则为应⽤程序之间共享数据提供了可能,⽐如你想要读取系统通讯录中的联系⼈,就需要通过ContentProvider来实现。
2. 丰富的系统控件
Android系统为开发者提供了丰富的系统控件,也可以编写出我们想要的界⾯。
3.SQLite数据库
Android系统自带的数据库具有轻量级、运算速度快⽀持标准的SQL语法,还可以通过Android封装好的API进⾏操作,让存储和读取数据变得⾮常⽅便。
- 提供多媒体服务
例如⾳乐、视频、录⾳、拍照等。
开发Android程序需要准备的⼯具
JDK。JDK是Java语⾔的软件开发⼯具包,它包含了Java的运⾏环境、⼯具集合、基础类库等内容。
Android SDK。Android SDK是Google提供的Android开发⼯具
包,在开发Android程序时,我们需要通过引⼊该⼯具包来使⽤Android相关的API。
Android Studio。
搭建开发环境:Android官网可以下载https://developer.android.google.cn/studio。不过,Android官⽹有时访问会不太稳定,如果你⽆法访问上述⽹址,也可以到⼀些国内的代理站点进⾏下载,⽐如:http://www.android-studio.org。
下载下来的将是⼀个安装包,安装的过程也很简单,基本上⼀直点
击“Next”就可以了弹出来的⽆法访问add-on list的警告对话框
点cancel就可以了之后⼀直点击“Next”,直到完成安装,然后启动Android Studio。⾸次启动会让你选择是否导⼊之前Android Studio版本的配置,由于这是我们⾸次安装,选择不导⼊即可。
Android Studio的配置界⾯,然后点击“Next”开始进⾏具体的配置
选择安装类型
这⾥我们可以选择Android Studio的安装类型,有Standard和Custom两种。Standard表⽰⼀切都使⽤默认的配置,⽐较⽅便;Custom则可以根据⽤户的特殊需求进⾏⾃定义。
选择Android Studio的主题⻛格Android Studio内置了深⾊和浅⾊两种⻛格的主题。
现在点击“Finish”按钮,配置⼯作就全部完成了。然后Android Studio会尝试联⽹下载⼀些更新,等待更新完成后再点击“Finish”按钮,就会进⼊Android Studio的欢迎界⾯。
接下来创建HelloWorld项⽬
在Android Studio的欢迎界⾯点击“Start a new Android Studio
project”,选择empty activity就可以了,点next会进入配置界面。这里在name上填helloworld就可以了
Package name表⽰项⽬的包名,Android系统就是通过包名来区分不同 应⽤程序的,因此包名⼀定要具有唯⼀性。Android Studio会根据应⽤名称来⾃动帮我们⽣成合适的包名。如果不想可自行修改。
Save location表⽰项⽬代码存放的位置,如果没有特殊要求的话,这⾥也保持默认即可。接下来的Language就很重要了,这⾥默认选择了Kotlin。Minimum API level可以设置项⽬的最低兼容版本。将Minimum SDK指定成API 21就可以了。最后俩个复选框选择Android X然后点击finish。
项目建立成功然后启动模拟器就可以了。
点击顶部工具栏图标,创建模拟器点击“Create Virtual Device”按钮就可以⽴刻开始创建了。
选择要创建的模拟器设备
这⾥有很多种设备可供我们选择,不仅能创建⼿机模拟器,还可以创建平板、⼿表、电视等模拟器。 可以选择创建Pixel这台设备的模拟器。
然后点next。
接下来要下载镜像。然后确认模拟器配置,可以指定模拟器的名
字、分辨率、横竖屏等信息。然后点击finish
模拟器列表
点击Actions栏⽬中最左边的三⾓形按钮即可启动模拟器。
启动后的模拟器界⾯是Android界面。模拟器启动后将helloworld项⽬运⾏到模拟器上。点击Android标志隔壁的三角就可以了。点击之后模拟器就会运行项目。
Android项目结构切换Project模式的项⽬结构
res⽬录下的结构
所有以“drawable”开头的⽬录都是⽤来放图⽚的,所有以“mipmap”开头的⽬录都是⽤来放应⽤图标的,所有以“values”开头的。⽬录都是⽤来放字符串、样式、颜⾊等配置的,所有以“layout”开头的⽬录都是⽤来放布局⽂件的。
“mipmap”开头的⽬录,其实主要是为了让程序能够更好地兼容各种设备。drawable⽬录也是相同的道理。
是我们应该⾃⼰创建drawable-hdpi、drawable
xhdpi、drawable-xxhdpi等⽬录。在制作程序的时候,最好能够给同⼀张图⽚提供⼏个不同分辨率的版本,分别放在这些⽬录下,然后程序运⾏的时候,会⾃动根据当前运⾏设备分辨率的⾼低选择加载哪个⽬录下的图⽚。
drawable-xxhdpi⽬录是最主流的设备分辨率⽬录。
打开res/values/strings.xml⽂件,内容如下。
<resources>
<string name="app_name">HelloWorld</string>
</resources>
可以看到,这⾥定义了⼀个应⽤程序名的字符串,有俩种方法引用:
在代码中通过R.string.app_name可以获得该字符串的引⽤。
在XML中通过@string/app_name可以获得该字符串的引⽤。
引用图片就把string换成drawable
如果是图标就把string换成mipmap
如果是文件就把string换成layout
com.android.application表⽰这是⼀个应⽤程序模块,
com.android.library表⽰这是⼀个库模块。
应⽤程序模块是可以直接运⾏的,库模块只能作为代码库依附于别的应⽤程序模块来运⾏。
Android Studio项⽬⼀共有3种依赖⽅式:本地依赖、库依赖和远程依赖。
Android的日记工具:Log.v()<Log.d()<Log.i()<Log.w()<Log.e()
快捷键Shift + F10(Mac系统是control + R)
点击Android Studio底部⼯具栏的“Android Monitor”,在Logcat中就可以看到打印信息。
Logcat中的过滤器有Show onl
第二章
编程语言⼤致可以分为两类:编译型语言和解释型语言。
Kotlin和java 100%兼容
Kotlin中定义⼀个变量,只允许在变量前声明两种关键字:val(不可变)和var(可变)。
在Kotlin中Int变成了⼀个类,它拥有⾃⼰的⽅法和继承结构。
永远优先使⽤val来声明⼀个变量,⽽当val没有办法满⾜你的需求时再使⽤var。
函数和⽅法就是同⼀个概念
函数是⽤来运⾏代码的载体
参数的声明参数括号后⾯的那部分是可选的,⽤于声明该函数会返回什么类型的数据格式是“参数名: 参数类型”
使⽤代码补全功能后,Android Studio不仅会帮我们补全代码,还会帮我们⾃动导包
当⼀个函数中只有⼀⾏代码时,Kotlin允许我们不必编写函数体,可以直接将唯⼀的⼀⾏代码写在函数定义的尾部,中间⽤等号连接即可。
程序的执⾏语句主要分为3种:顺序语句、条件语句和循环语句。
Kotlin中的条件语句主要有两种实现⽅式:if和when
Kotlin中的if语句相⽐于Java有⼀个额外的功能,它是可以有返回值的,返回值就是if语句每⼀个条件中最后⼀⾏代码的返回值。
switch只能传⼊整型或短于整型的变量作为条件
is关键字就是类型匹配的核⼼,它相当于Java中的
instanceof关键字。由于checkNumber()函数接收⼀个Number类型的参数。
Kotlin中可以使⽤until关键字来创建⼀个左闭右开的区间
Step关键字可以跳过一些元素。downTo关键字可以创建一个降序的区间。
⾯向对象的语⾔是可以创建类的。类就是对事物的⼀种封装。
通过这种类的封装,我们就可以在适当的时候创建该类的对象,然后调⽤对象中的字段和函数来满⾜实际编程的需求,这就是⾯向对象编程最基本的思想。
Kotlin默认所有⾮抽象类都是不可以被继承的。
在Person类的前⾯加上open关键字就可以了
Kotlin将构造函数分成了两种:主构造函数和次构造函数。
主构造函数的特点是没有函数体,直接定义在类名的后⾯即可。
调⽤⽗类的构造函数:括号
Study接⼝的readBooks()和
doHomework()函数,这种就叫作⾯向接⼝编程,也可以称为多态。
Kotlin中特有的功能——单例类最常⽤、最基础的设计模式之⼀,它
可以⽤于避免创建重复的对象。
在Kotlin中创建⼀个单例类的⽅式极其简单,只需要将class关键字改成object关键字即可
listOf()函数创建的是⼀个不可变的集合。
不可变的集合指的就是该集合只能⽤于读取,我们⽆法对集合进⾏添加、修改或删除操作。
使⽤mutableListOf()函数创建可变集合。
Set集合中是不可以存放重复元素的,如果存放了多个相同的元
素,只会保留其中⼀份,这是和List集合最⼤的不同之处。
Map是⼀种键值对形式的数据结构
Lambda就是⼀⼩段可以作为参数传递的代码。
Lambda表达式的语法结构:{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
集合中的map函数是最常⽤的⼀种函数式API,它⽤于将集合中的每个元素都映射成⼀个另外的值,映射的规则在Lambda表达式中指定,最终⽣成⼀个新的集合。
filter函数是⽤来过滤集合中的数据的,它可以单独使⽤,也可
以配合函数一起用。
Kotlin默认所有的参数和变量都不可为空
doStudy()函数进⾏优化借助?.操作符将if判断语句去掉了
?:操作符:这个操作符的左右两边都接收⼀个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。
let既不是操作符,也不是什么关键字,⽽是⼀个函数。这个函数提供了函数式API的编程接⼝,并将原始调⽤对象作为参数传递到Lambda表达式中。
当Lambda表达式的参数列表 中只有⼀个参数时,可以不⽤声明参数名,直接使⽤it关键字来代替即可。
let函数是可以处理全局变量的判空问题的,⽽if判断语句则⽆法做到这⼀点。
因为全局变量的值随时都有可能被其他线程所修改,即使做了判空处理,仍然⽆法保证if语句中的study变量没有空指针⻛险。
类型不匹配错误提⽰:不过不⽤担⼼,Kotlin提供了另外⼀种神奇的机制,就是可以通过键值对的⽅式来传参,从⽽不必像传统写法那样按照参数定义的顺序来传参。
y selected application、Firebase、No Filters。