1.简介
1.1 系统架构
Android大概分为4层架构:
- Linux内核层
提供底层基本硬件驱动- 系统运行层
通过C/C++提供数据库、3D、浏览器等主要特性- 应用框架层
提供构建应用程序所需API- 应用层
手机上的应用程序
1.2 现行版本
主要以5.0在内以后的版本居多
1.3 开发特色
- 四大组件:Activity、Server、BordercastReceiver、ContentProvider
- 丰富的系统控件:可以自己定制
- SQLite数据库:轻量级、运算速度快的数据库,支持SQL语法
- 强大的多媒体
2. 开发环境
出问题问度娘,使用官方的AndroidStudio开发。
3. 第一个安卓项目
当你打开MyApplication项目会看到这样字的目录
但实际上的目录需要把Android换成Project
新版的IDE将目录简化了,所以开发起来会很快。刚开始学的时候不会很明白
下面对目录中所有的内容进行讲解
3.1 项目外层目录
文件名 | 解释 |
---|---|
.grand/.idea | AS自动生成的文件 |
app | 项目中的代码、资源 |
build | 编译时自动生成的文件 |
gradle | 包含了Gradle wrapper文件安装后没有需要手动下载 |
.gitigonore | 用来将指定目录或文件排除在版本控制之外 |
build.grade | 项目布局的gradle构建脚本 |
gradle.properties | gradle配置文件 |
HelloWorld.iml | 所有的IntelliJ IDEA都会生成的文件 |
setting.gradle | 用于指顶项目中所有引用的模块 |
3.2 app目录
文件名 | 解释 |
---|---|
build | 这个目录和外层的build类似,但是文件更多 |
libs | 如果项目中有第三方jar包,就要把jar包放到这里,jar包会被自动添加到项目中 |
androidTest | 可以对项目自动化测试 |
res | 项目中的图片、布局、字符串资源都在这里,这里也可以添加权限声明 |
test | 编写UnitTest用,对项目进行自动化测试的另一种方式 |
.gitigonre | 用于将app模块内指定目录或文件排除在版本控制之外,和外层的.gitignore类似 |
app.iml | IDE自动生成的文件 |
build.gradle | 是app获取模块的脚本,这个文件中会制指定很多项目构建相关配置 |
proguard-rules.pro | 这个文件用于制定代码项目的混淆规则,当代码开发完成之后打包成软件安装包 |
3.3 HelloWorld是如何运行的
打开Android-Mainfest.xml
文件,可以看到
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这段代码对MainActivity进行注册,没有在这个文件中注册的Activity是不能用的。其中<intent-filter>
包含的代码很重要,<action ...>
,<category ...>
表示MainActively是这个项目的主Activity,在手机上点击图标启动的就是这个。
Activity,凡是显示在应用界面内的东西都是Activity里的,注册看完了那就去看一看MainActivity.kt
的代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
首先,MainActivity继承自AppCompatActivity,AppCompatActivity是AndroidX提供的一种向下兼容的Activity,可以让Activity在不同版本中保持一致的功能。Activity是Android提供的一个基类,所有自定义Activity只有继承它或者它的子类才能获得Activity的特性,而AppCompatActivity是Activity的一个子类。
再往下看,我们会看到一个onCreate()
方法,这个方法是Activity被创建时必须执行的方法。
然而我们发现,这个文件中没有HelloWord,HelloWorld在哪里呢?
在布局文件res/layout/activity_main.xml
这个文件中。因为这里的布局文件和Activity是分开的,在布局中边界界面,然后在Activity中引入。
<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>
布局代码中,中间有个<TextView ... />
这个是用来显示文字的控件。在这些代码中,我们终于看到了HelloWorld
找个HelloWorld都这么费劲
3.4 详解项目中的资源
打开res目录
发现有很多mipmap开头命名的文件夹,它们都是用来存放图标的目录。为了让程序兼容各种设备,Drawable目录中的文件也是一样的道理。所以我们自己在开发的时候应该自己创建drawable-hdip、drawable-xhdpi、drawable-xxhdip。在作图的时候把一个图标准备多种分辨率。好麻烦大多数情况下就放在drawable-xxhdip目录下就行啦。
3.5 使用这些资源-修改图标
打开res/values/strngs.xml
文件
<resources>
<string name="app_name">My Application</string>
</resources>
helloword这个初始项目中只有这三行代码,这里看到<string ...>
中包含的My Application就是我们的项目名称。有以下两种方式去引用它们:
- 在代码中通过
R.tring.app_name
可以获得该字符串的引用 - 在XML中通过
@string/app_name
可以获得该字符串的引用
其中string是可以替换的,图片就替换成drawable,图标就替换成mipmap,引用的布局文件可以换成layout。
<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>
在AndroidManifest.xml文件,找到<application>
中包裹的代码。HelloWorld的项目应用图标就是通过android:icon
属性指定的
3.6 build.gradle文件
因为AS是使用gradle来构建项目,我们有两个build.geadle文件,一个在外层目录下、一个在app目录中。
先来看看外层目录下的build.gradle
buildscript {
ext.kotlin_version = "1.4.0"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
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()
jcenter()
}
}
这些代码是自动生成的,其中两处repositories闭包中都声明了google()
和jcenter()
这两行进行配置。这两个包都对应一个代码仓库,google仓库就是他们自家的扩展依赖,jecnter是第三方的开源库,声明之后就可以在项目中使用了。
dependencies闭包使用的classpath声明了两个插件:gradle插件和kotlin插件,因为如果要构建Android项目需要找到gradle专门用来构建Android的插件,后面的数字是插件的版本号。Kotlin插件的意思也差不多一样,用Kotlin进行开发然后是版本号。如果使用的是Java开发就不需要声明这个
除非像添加一些全局项目构建配置就不需要改动这个文件
接下来是app目录下的build.gradel文件,代码如下:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.1'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
第一行应用了一个插件,一般有两种值可选
- com.android.applaction 表示这是一个应用程序模块,可以直接运行
- com.android.library 表示这是一个库模块,只能作为代码库运行
接下来两行应用了kotlin-android
和kotlin-android-extentions
两个插件。如果用kotlin开发安卓,第一个是必用的。第二个是Kotlin扩展,在后续开发时会非常的方便。
然后是个Android闭包闭包中可以配置各种属性,compileSdkVersion
用于指顶项目的编译版本,后续跟着的数字就对应指定版本。
android包里面有defaultConfig
,这个闭包可以进行更多细节的配置。其中applicationId
就是每一个应用的唯一标识符,不能重复,默认会使用我们创建项目时指定的包名。
minSdkVersion
指定兼容的最低版本
targetSdkVersion
+指定的值表示系统会根据最新系统指定新的特性
versionCode
指定项目版本号
versionName
指定项目的版本名
testInstrumentationRunner
用于在当前项目中启用JUnit测试
接下来看buildTypes
闭包,这个闭包用于指定生成安装文件的相关配置,通常会有两个子闭包:debug和release。
debug很明显能明白它的意思了,release用于指定生成正式版安装文件的配置。debug可以忽略不写的。其中release内的minifyEnabled用于指定是否对项目的的代码进行混淆,t混淆,f不混淆。proguardFile执行混淆时使用的规则文件。这里指定了'proguard-android-optimize.txt'和 'proguard-rules.pro'
总而言之这部分内容有点长,不是很像写
4 log工具
android.unit.log类中提供了5个方法打印日志
大概的使用方法
Log.d("MainActivity","onCreate execute");
第一个参数tag:一般传入当前类名就好,主要用于队打印信息进行过滤.
第二个参数:msg,具体想打印的内容
function | trans |
---|---|
Log.v() | 打印最琐碎的日志 |
Log.d() | 打印调试信息 |
Log.i() | 打印重要信息 |
Log.w() | 打印警告信息 |
Log.e() | 打印错误信息 |
4.1 在hello World中添加log工具
打开hello World的MainActivity,在onCreate方法中添加一行打印日志语句:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("MainActivity","onCreated execute")
}
运行之后在log cat中会看到一些日志信息
2020-09-17 10:58:01.559 8491-8533/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe17040c0: ver 2 0 (tinfo 0xe1703290)
2020-09-17 10:58:01.622 8491-8533/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe17040c0: ver 2 0 (tinfo 0xe1703290)
2020-09-17 10:58:01.742 8491-8533/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe17040c0: ver 2 0 (tinfo 0xe1703290)
免责信息
本书内容为《第一行代码》第三版学习笔记,本文如有侵权请练习我。我会第一时间删除
欢迎学习讨论,转载请注明连接作者谢谢(鞠躬