====================================
====== 第一章:开始启程 ======
====================================
Android四层架构:Linux内核层(硬件)、系统运行库层(底层类库)、应用框架层(框架)、应用层
继续书籍:学习一下JavaSE的基础。然后就可以直接看“第一行代码第二版”
四大组件:
活动(activity)、应用程序的门面,看得见摸得着的东西
服务(service)、后台默默运行的就是服务,即使用户退出了应用,仍可以继续运行
广播接收器(broadcast receiver)、允许接受各处的广播消息,电话、短信等
内容提供器(content provider)、为应用程序之间共享数据(比如获取电话簿中联系人)
搭建开发环境:按照网上的教程即可。书籍不一定是最新的。针对Mac。先安装JDK即可,我下载的是1.8的。然后安装Android Studio(Android的开发工具,然后按照步骤,无需做额外的设置就可以运行了)
目录结构解释:
看一下项目的结构,我们的主要活动都在src文件夹里面。
.gradle、.idea目录:都是放置Android studio这个开发工具自动生成的一些文件,无需关心,不要手动编辑。
App:项目中的代码资源都在这个目录下,等会会详细解释。我们最主要关心的就是这个目录。
gradle:这个目录下包含了gradle wrapper的配置文件。Android studio默认没有启用gradle wrapper的方式。不明白,后面以后可能会解释。
.gitignore:很明显这是用于版本管理控制的忽略文件的。
ActivityTest.iml:iml文件是所有IntelliJ JDEA项目都会自动生成的一个文件(Android Studio就是基于IntelliJ JDEA开发的),这个用于标识这是一个IntelliJ IDEA项目)。
Build.gradle:项目全局的gradle构建脚本,通常这个文件中的内容是不需要修改的。
Gradle.properties:全局的gradle配置文件,在这个文件配置的属性会影响到项目中所有的gradle编译脚本
gradlew和gradlew.bat:用来在命令行界面中执行gradle命令,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用。
Local.properties:用于指定Android SDK路径,通常内容都是自动生成的,不需要修改,除非你本机中的AndroidSDK位置发生了改变。那么改为新的位置即可。
Settings.gradle:用于指定项目中所有引入的模块。由于项目中只有一个app模块。因此该文件只引入了app这一个模块,通常模块也是自动完成的不需要我们手动去修改。
详细介绍app目录:
Build目录:包含一些在编译时自动生成的文件,我们无需关心。
Libs目录:如果项目用到了第三方jar包,就需要把这些jar包放到libs目录下,放在这个目录下的jar包会被自动添加到构建路径里。
Src目录,最主要的目录:
androidTest:用于编写Android测试用例的。
main里面:
Androidmannifest.xml:整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册,另外还可以给应用程序添加权限声明等等。
Test:编写单元测试用例的。
proguard_rules.pro:用于指定项目代码的混淆规则。
Java:放置我们素有java代码的地方,比如关联我们activity的java代码就在这里。
Res:资源目录:
drawable用来存放图片的。
Mipmap开头的用来存放图标的。(多个文件夹主要用于适配多种机型不同分辨率)
Values开头的用来存放字符串、样式、颜色等配置的。
Layout用来存放布局文件的。
看一下Manifest.xml文件。没有在Manifest.xml中注册的活动是不能使用的。
Activity是Android系统提供的一个活动的基类,我们项目中所有的活动都必须继承它或它的子类才能拥有活动的特性)(AppCoompatctivity是Activity的子类)
onCreate()方法,是一个活动被创建时必定会执行的方法。
setContentView()方法,就是这个方法给当前的活动引入了一个hello_world_layout布局,(在res/layout目录下可以找到hello_world_layout.xml这个文件)
打开这个xml文件并切换到Text视图。(底部可以看到切换“design”和“text”两种视图)
再看一下src/res目录中:
drawable开头的文件夹是用来存放图片的。(有多个文件夹也是为了适配各种设备,我们也可以自己创建drawable-hdpi、drawable-xhdpi等等文件夹。)
所有以mipmap开头的文件夹都是用来存放应用图标的。(之所有有这么多个文件开头是为了更好的适配各种机型)
所有以values开头的文件夹都是用来存放字符串、样式、颜色等配置的,
layout文件夹是用来存放布局文件的。
当程序运行时,会自动根据当前运行设备分辨率的高低选择加载哪个文件夹下的图片。(如果美工只提供给我们一份图片,这时我们把图片放在drawable-xxhdpi中即可)
1、修改一下values文件夹下的strings.xml文件
<resources>
<string name=“app_name”>HelloWorld<string/>
</resources>
A、在代码中可以通过R.string.app_name可以获得该字符串的引用
B、在xml中通过@string/app_name可以获得该字符串的引用
其实基本语法就是A、B这两种方式。其中string部分是可以替换的,如果是引用图片资源,可以替换成drawable。如果是引用应用图标,可以替换成mipmap。如果是引用布局文件,可以替换成
这时候解释一下AndroidManifest.xml文件:
<application
android:allowBackup:”true”
android:icon=“@mipmap/ic_la”
android:label=“@string/app_name”
android:supportsRtl=“true”
android:theme=“@style/AppTheme”>
…
</application>
其中,HelloWorld项目的应用图标是通过android:icon属性类指定的,应用名称由android:label属性指定的,
详解build.gradel文件:
不同于Eclipse,Android Studio是采用Gradle来构建项目的。gradle是一个非常先进的项目构建工具。它使用了一种基于groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于xml(如ant和maven)的各种繁琐配置。
HelloWorld项目中有两个build.gradle文件,一个是最外层目录下,一个是在app目录下。这两个文件对构建android studio项目起到至关重要的作用。
1、最外层的build.gradle文件:
buildscript {
respsitories {
// 代码托管仓库,声明之后,我们就可以在项目中轻松引用jcenter上的开源项目了
jcenter()
}
dependencies {
// 声明一个gradle插件。因为gradle并不是专门为android而生的,要想使用它构建android项目,就需要声明以下的插件
classpath ‘com.android.tools.build:gradle:2.2.0’
}
}
allprojects {
repositories {
jcenter()
}
}
这些代码都是自动生成的。
2、app目录下的build.gradle文件:
// 定义了一个插件(一般有两种值可选,com.android.library表示这是一个库模块,application表示是一个应用模块,应用模块可以直接运行,库模块只能作为代码库依附于别的应用程序模块来运行。
apply plugin: ‘com.android.application’
// android闭包
android {
// 编译版本
compileSdkVersion 24
// 构建工具的版本,如果有更新的版本,android studio会有提示
buildToolsVersion “24.0.2”
defaultConfig {
// 项目的包名,前面其实我们已经指定过包名,如果想在后面对其修改,就是在这里修改。
appliationId “com.example.helloworld”
// 最低sdk的版本,15表示最低兼容到android4.0
minSdkVersion 15
// 表示你在该版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性(如果是23以上,系统会为你的程序启用运行时权限功能)
tragetSdkVersion 24
// 版本号
versionCode 1
// 版本名
versionName “1.0”
}
// 用于指定安装文件的配置
buildTypes {
release {
// 用于是否对项目代码进行混淆。true表示混淆,false表示不混淆
minifyEnabled false
// 混淆时使用的规则文件,这里指定了两个文件
proguardFiles getDefaultProguardFile(‘proguard-android.txt’),’proguard.rules.pro’
}
// debug表示测试版,可以忽略不写
}
}
// 可以指定当前项目所有的依赖关系,通常项目一共有三种依赖方式,1、本地依赖。2、库依赖。3、远程依赖。
// 本地依赖可以对本地的jar包或目录添加依赖关系
// 库依赖可以对项目中的库模块添加依赖关系
// 远程依赖可以对jcenter库上的开源项目添加依赖关系
dependencies {
// 这是本地依赖,它将libs目录下所有.jar后缀的文件都添加到项目的构建路径中。
compile fileTree(dir:’libs’, include: [‘*.jar’])
// 远程依赖声明,加上这个声明,gradle在构建项目时会首先检查一下本地是否已经有这个库的缓存,如果没有的话就会去自动联网下载,然后再添加到项目的构建路径中
compile ‘com.android.support:appcompat-v7:24.2.1’
// 用于单元测试用例库的
testCompile ‘junit:junit:4.12’
}
日志工具类:Log(android.util.Log),以下五个方法供我们打印日志。
Log.v() 用于打印最琐碎的意义最小的日志信息。对应级别verbose,是android日志里面级别最低的一种。
Log.d() 用于打印一些调试信息,对调试和分析问题有帮助。对应级别debug,比verbose高一级
Log.i() 用于打印一些比较重要的数据,可以帮你分析用户行为数据。对应界别info,比debug高一级
Log.w() 用于打印一些警告信息,提示程序这个地方可能存在潜在风险。对应级别warn,比info高一级
Log.e() 用于打印一些错误信息,比如程序进入了catch语句中,代表你的程序出现严重问题了,必须尽快修复。对应级别error,比warn高一级。
貌似还有一个assert,
不建议用System.out.println()来输出日志,android studio已经不支持syso的快捷输入了。输入logd,再点tab键,就可以自动补全
如在onCreate()方法的外面输入logt,然后按下tab键,就可以以当前的类名为值自动生成一个Tag常量。
如下所示:
private static final String TAG = "HelloWorldActivity";
Logcat可以轻松添加过滤器,运行项目之后,从Android studio中的底部可以很容易看到logcat。