美文网首页
Android笔记——快速入门

Android笔记——快速入门

作者: 莫忘初心_倒霉熊 | 来源:发表于2022-02-08 18:03 被阅读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程序的执行流程。

    相关文章

      网友评论

          本文标题:Android笔记——快速入门

          本文链接:https://www.haomeiwen.com/subject/pcjwkrtx.html