开始启程,你的第一行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>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
MainActivity: AppCompatActivity是AndroidX中提供的一种向下兼容的Activity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
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 {
classpath "com.android.tools.build:gradle:4.2.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
jcenter()
}
}
app目录下的build.gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.helloworld"
minSdkVersion 21
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'
}
debug{
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
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 '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
关键字过滤 可以输入自己想要获取的某个关键字
学习时间:
提示:这里可以添加计划学习的时间 例如: 1、 周一至周五晚上 7 点—晚上9点 2、 周六上午 9 点-上午 11 点 3、 周日下午 3 点-下午 6 点
学习产出:
提示:这里统计学习计划的总量 例如: 1、 技术笔记 2 遍 2、CSDN 技术博客 3 篇 3、 学习的 vlog 视频 1 个 ;
|