Android笔记——快速入门

2022-02-08  本文已影响0人  莫忘初心_倒霉熊

1.0Android简介

1.1Android系统结构

Android大致可以分为4层架构:Linux内核层、系统运行库层、应用框架层和应用层。

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


    Android系统架构

1.2Android系统版本

Android系统版本及其详细信息
最新的数据可以访问http://developer.android.google.cn/about/dashboards

1.3Android四大组件

Android系统四大组件分别是Activity、Service、BroadcastReceiver和ContentProvider。

  1. Activity:是所有Android应用程序的门面,凡是在应用中你看得到的东西,都是放在Activity中的。
  2. Service:就比较低调了,你无法看到它,但它会在后台默默地运行,即使用户退出了应用,Service仍然是可以继续运行的。
  3. BroadcastReceiver:允许你的应用接收来自各处的广播消息,比如电话、短信等,当然,你的应用也可以向外发出广播消息。
  4. ContentProvider:则为应用程序之间共享数据提供了可能,比如你想要读取系统通讯录中的联系人,就需要通过ContentProvider来实现。

2.0Android文件结构

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,进行配置更改。

  1. .gitignore:这个文件是用来将指定的目录或文件排除在版本控制之外的。
  2. build.gradle:这是项目全局的gradle构建脚本,通常这个文件中的内容是不需要修改的。
  3. gradle.properties:这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
  4. gradlew和gradlew.bat:这两个文件是用来在命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用的。
  5. HelloWorld.imliml:这个文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,不需要修改这个文件中的任何内容。
  6. local.properties:这个文件用于指定本机中的Android SDK路径,通常内容是自动生成的,我们并不需要修改。除非你本机中的Android SDK位置发生了变化,那么就将这个文件中的路径改成新的位置即可。
  7. settings.gradle:这个文件用于指定项目中所有引入的模块。由于HelloWorld项目中只有一个app模块,因此该文件中也就只引入了app这一个模块。通常情况下,模块的引入是自动完成的,需要我们手动修改这个文件的场景可能比较少。

2.1 app目录下的文件结构

除了app目录之外,大多数的文件和目录是自动生成的,并不需要进行修改。app目录下的内容才以后的工作重点,展开之后的结构如图


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

2.2 res目录下的文件结构

res目录下的结构
  1. 所有以“drawable”开头的目录都是用来放图片的
  2. 所有以“mipmap”开头的目录都是用来放应用图标的
  3. 所有以“values”开头的目录都是用来放字符串、样式、颜色等配置的
  4. 所有以“layout”开头的目录都是用来放布局文件的

之所以有这么多“mipmap”开头的目录,其实主要是为了让程序能够更好地兼容各种设备。drawable目录也是相同的道理,虽然Android Studio没有帮我们自动生成,但是我们应该自己创建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等目录。

2.2.1使用资源

这里以strings.xml文件为例。
打开res/values/strings.xml文件,内容如下所示:

<resources>
    <string name="app_name">My Application</string>
</resources>

这里定义了一个应用程序名的字符串,有以下两种方式来引用它。

  1. 在代码中通过R.string.app_name可以获得该字符串的引用。
  2. 在XML中通过@string/app_name可以获得该字符串的引用。

基本的语法就是上面这两种方式,其中string部分是可以替换的,如果是引用的图片资源就可以替换成drawable,如果是引用的应用图标就可以替换成mipmap,如果是引用的布局文件就可以替换成layout,以此类推。

3.0详解build.gradle文件

不同于Eclipse,Android Studio是采用Gradle来构建项目的。
Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来进行项目设置,摒弃了传统基于XML(如Ant和Maven)的各种烦琐配置。

可以看到,项目中有两个build.gradle文件,一个是在最外层目录下的,一个是在app目录下的。

3.1最外层目录的build.gradle

代码如下:

buildscript {
    ext.kotlin_version = '1.3.61'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}
  1. 两处repositories的闭包中都声明了google()和jcenter()这两行配置,它们分别对应了一个代码仓库。声明了这两行配置之后,我们就可以在项目中轻松引用任何google和jcenter仓库中的依赖库了。
    google仓库中包含的主要是Google自家的扩展依赖库。
    jcenter仓库中包含的大多是一些第三方的开源库。
  2. dependencies闭包中使用classpath声明了两个插件:一个Gradle插件和一个Kotlin插件。
    com.android.tools.build:gradle:3.5.2,最后面的部分是插件的版本号,它通常和当前Android Studio的版本是对应的
    另外一个Kotlin插件则表示当前项目是使用Kotlin进行开发的,如果是Java版的Android项目,则不需要声明这个插件。Kotlin插件的版本号是1.3.61。

3.2 app目录下的build.gradle

代码如下:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 32
    buildToolsVersion '28.0.3'

    defaultConfig {
        applicationId 'com.test.test'
        minSdkVersion 21
        targetSdkVersion 32
        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-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
  1. 第一行应用了一个插件,一般有两种值可选:<1>com.android.application表示这是一个应用程序模块<2>com.android.library表示这是一个库模块。
    二者最大的区别在于,应用程序模块是可以直接运行的,库模块只能作为代码库依附于别的应用程序模块来运行。
  2. 接下来的两行应用了kotlin-android和kotlin-android-extensions这两个插件。
    <1>如果你想要使用Kotlin来开发Android项目,那么第一个插件就是必须应用的。
    <2>第二个插件帮助我们实现了一些非常好用的Kotlin扩展功能。
  3. 紧接着是一个大的android闭包,在这个闭包中我们可以配置项目构建的各种属性。
    <1>compileSdkVersion用于指定项目的编译版本,这里指定成32表示使用Android API 32系统的SDK编译。
    <2>buildToolsVersion用于指定项目构建工具的版本,版本是28.0.3。
  4. 闭包中又嵌套了一个defaultConfig闭包,defaultConfig闭包中可以对项目的更多细节进行配置。
    <1>applicationId是每一个应用的唯一标识符,绝对不能重复。<2>minSdkVersion用于指定项目最低兼容的Android系统版本,这里指定成21表示最低兼容到Android 5.0系统。
    <3>targetSdkVersion指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如Android 6.0系统中引入了运行时权限这个功能,如果你将targetSdkVersion指定成23或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将targetSdkVersion指定成22,那么就说明你的程序最高只在Android 5.1系统上做过充分的测试,Android 6.0系统中引入的新功能自然就不会启用了。
    <4>versionCode用于指定项目的版本号。
    <5>versionName用于指定项目的版本名。
    <6>testInstrumentationRunner用于在当前项目中启用JUnit测试,你可以为当前项目编写测试用例,以保证功能的正确性和稳定性。
  5. buildTypes闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包:一个是debug,一个是release。
    <1>debug闭包用于指定生成测试版安装文件的配置。
    debug闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。
    <2>release闭包用于指定生成正式版安装文件的配置。
    (1)minifyEnabled用于指定是否对项目的代码进行混淆,true表示混淆,false表示不混淆。
    (2)proguardFiles用于指定混淆时使用的规则文件,这里指定了两个文件:
    第一个proguard-android-optimize.txt是在<Android SDK>/tools/proguard目录下的,里面是所有项目通用的混淆规则;
    第二个proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。

注意:通过Android Studio直接运行项目生成的都是测试版安装文件。

  1. dependencies闭包它可以指定当前项目所有的依赖关系。通常Android Studio项目一共有3种依赖方式:本地依赖、库依赖和远程依赖。
    <1>本地依赖可以对本地的jar包或目录添加依赖关系。
    implementation fileTree就是一个本地依赖声明,它表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径中。
    <2>库依赖可以对项目中的库模块添加依赖关系。
    库依赖声明这里没有用到,它的基本格式是implementationproject后面加上要依赖的库的名称,比如有一个库模块的名字叫helper,那么添加这个库的依赖关系只需要加入implementation project(':helper')这句声明即可。
    <3>远程依赖则可以对jcenter仓库上的开源项目添加依赖关系。
    implementation则是远程依赖声明,androidx.appcompat:appcompat:1.0.2就是一个标准的远程依赖库格式,加上这句声明后,Gradle在构建项目时会首先检查一下本地是否已经有这个库的缓存,如果没有的话则会自动联网下载,然后再添加到项目的构建路径中。
    androidx.appcompat是域名部分,用于和其他公司的库做区分;
    appcompat是工程名部分,用于和同一个公司中不同的库工程做区分;
    1.1.0是版本号,用于和同一个库不同的版本做区分。
    <4>剩下的testImplementation和androidTestImplementation都是用于声明测试用例库的。

4.0Android程序执行流程

当我们创建一个默认的Android项目时,直接在虚拟机上运行,会显示HelloWorld文字,那文字又是如何显示的呢?

  1. 首先打开Android- Manifest.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进行注册,没有在AndroidManifest.xml里注册的Activity是不能使用的。
其中intent-filter里的两行代码非常重要,<actionandroid:name="android.intent.action.MAIN"/> 和<categoryandroid:name="android.intent.category.LAUNCHER" />表示MainActivity是这个项目的主Activity,在手机上点击应用图标,首先启动的就是这个Activity。

  1. 再打开MainActivity,代码如下所示:
package com.example.myapplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

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的子类)。然后可以看到MainActivity中有一个onCreate()方法,在onCreate()方法的第二行调用了setContentView()方法,给当前的Activity引入了一个activity_main布局。

  1. 布局文件定义在res/layout目录下的,打开activity_main.xml文件并切换到Text视图,代码如下所示:
<?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>

可以看到代码中有一个TextView,用于在布局中显示文字。通过android:text="Hello World!"显示Hello World!。这就是一个Android程序的执行流程。

上一篇下一篇

猜你喜欢

热点阅读