Android 介绍

Android 系统是目前占有率最高的移动操作系统,它大致可以分为四层架构:

  • Linux 内核层:Android 系统是基于 Linux 内核,这层为 Android 设备的各种硬件提供底层驱动,如:显示驱动、音频驱动、蓝牙驱动等。
  • 系统运行库层:通过一些 C/C++ 库来为 Android 系统提供主要的特性支持。
  • 应用框架层:提供构建应用程序时可能用到的各种 API
  • 应用层:所有安装在手机上的应用程序都是属于这一层。比如系统自带的联系人、短信等程序。

Android 系统有四大组件,分别是:活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。

  • 活动 Activity:可以理解为所有应用程序的门面,凡是在应用中看到的东西都放置在活动中
  • 服务 Service:与 活动 不同,服务是在后台运行的,即使用户退出应用,服务也可以继续运行
  • 广播接收器 Broadcast Receiver:广播接收器允许应用接收来自各处的广播消息,比如电话、短信等
  • 内容提供器 Content Provider:为应用之间共享数据提供了可能

1 Android Studio 初始化项目的项目结构

开发 Android 最好就是使用 Android Studio IDE,Android Studio 初始化项目的目录结构如下:
在这里插入图片描述

  • .gradle.idea:这两个目录复制都是 AS 自动生成的一些文件
  • app:项目中的代码、资源等内容几乎都是放置在该目录下
  • build:主要是一些编译时自动生成的文件
  • gradle:这个目录下包含 gradle wrapper 的配置文件 gradle-wrapper.properties,它包含 gradle 的版本号,使用 gradle wrapper 的方式导入项目不需要提前将 gradle 下载好,而是会自动根据本地缓存情况决定是否下载 gradle,是否使用 gradle wrapper 方式可以在 AS 导航栏中的 Settings 设置。
  • build.gradle这是项目全局的 gradle 构建脚本,通常不用修改。使用多模块的时候,可以在这里定义引用库的版本号,给内部的 gradle 构建脚本使用
  • gradle.properties:这是 gradle 的全局配置文件
  • MyAndroidApp.imliml 文件是所有 IDEA 项目都会自动生成的一个文件,而 AS 是基于 IDEA 开发的。
  • local.properties:这个文件用于指定本机中的 Android SDK 路径,是软件自动生成
  • settings.gradle:该文件用于指定项目中所有引入的模块

1.1 app 目录的结构

上面已经介绍过 app 目录才是项目的重点,它的目录结构是:
在这里插入图片描述

  • build:与外层的 build 目录类似,主要是一些编译时自动生成的文件,无需关心
  • libs:项目中使用的第三方 jar 包,就需要把这些 jar 包放置在 libs 目录下,放置在这个目录下的 jar 包都会自动添加到构建路径中
  • androidTest:自动化测试
  • java:放置 java 代码的地方
  • res:项目中使用到的所有图片、布局、字符串等资源都要放置在该目录下,比如:
    • drawable放置图片文件
    • mipmap放置应用图标
    • layout放置布局文件
    • values放置字符串、样式、颜色等配置
  • AndroidMainfest.xml:该文件是整个项目的配置文件,在程序中定义的所有四大组件都需要在这个文件中进行注册,还可以给应用程序添加权限声明
  • test:自动化测试
  • .gitignore:值得注意的是 app 模块的外层也有 .gitignore 文件
  • app.iml:IDEA 项目自动生成的文件
  • build.gradleapp 模块即当前模块的 gradle 构建脚本
  • proguard-rules.pro:用于指定项目代码的混淆规则,当代码开发完成后打包成安装包文件,如果不希望代码被人破解,就需要将代码进行混淆,让破解者难以阅读

1.1.1 详解 build.gradle 文件

AS 是采用 gradle 来构建项目的,gradle 是一个项目构建工具,它使用一种基于 Groovy 的领域特定语言来声明项目设置。
在前面已经说过,一个刚刚初始化的项目中有两个 build.gradle 文件,一个是在外层,一个是在 app 目录下的。
刚初始化的最外层 build.gradle 文件,代码如下:

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • repositories 闭包:表示仓库设置,jcenter 是一个代码托管仓库,很多 Android 开源项目都会选择将代码托管到 jcenter 上,声明了 jcenter 这行配置,就可以在项目中轻松应用任何 jcenter 上的开源项目,google 同理
  • 使用 classpath 声明一个 gradle 插件,gradle 除了构建 Android 项目还可以构建 Java、C++ 等多种项目,所以需要声明 com.android.tools.build:gradle 这个插件来告知 gradle 构建 Android 项目。

app 目录下的 build.gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "top.seiei.myandroidapp"
        minSdkVersion 19
        targetSdkVersion 29
        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 'androidx.appcompat:appcompat:1.1.0'
    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'
}
  • 代码的第一行表示应用了一个插件,一般有两个值可选:
    • com.android.application:表示这是个 应用程序模块
    • com.android.library:表示这是个 库模块,二者区别在于,前者是可以直接运行的,后者需要应用程序模块引用
  • android 闭包:这个闭包设置了项目构建的各种属性:
    • compileSdkVersion:指定项目的编译版本
    • buildToolsVersion:指定项目构建工具的版本
    • defaultConfig 闭包:
      • applicationId 指定项目的包名(想要修改包名,即可在这里修改)
      • minSdkVersion 指定项目最低兼容的 Android 系统版本
      • targetSdkVersion 指定的值表示你再该目标版本上已经做过了充分的测试,系统会将为你的应用程序启用一些最新的功能和特性
      • versionCode:指定项目的版本号,在生成安装文件时用到
      • versionName:指定项目的版本名,在生成安装文件时用到
    • buildTypes 闭包:指定生成安装文件的相关配置
      • release 闭包:指定正式版安装文件的配置,其中 minifyEnabled 表示是否对项目的代码进行混淆,proguardFiles 表示指定混淆时使用的规则文件
      • debug 闭包:指定测试版安装文件的配置,可以忽略
    • dependencies 闭包:通常 AS 项目有三种依赖方式:本地依赖、库依赖和远程依赖。
      • 本地依赖可以对本地的 Jar 包或目录添加依赖关系。上面的 implementation fileTree 就是一个本地依赖声明,它表示将 libs 目录下的所有 .jar 后缀的文件都添加到项目的构建路径中
      • 库依赖可以对项目中的库模块添加依赖关系。它的基本格式是:implementation project 后面加上要依赖的库模块的名称,如一个库模块的名称叫 helper,那么声明就为 implementation project(':helper')
      • 远程依赖可以对如 jcenter 库上的开源项目添加依赖关系。上面的 implementation androidx.appcompat:appcompat:1.1.0 就是一个远程依赖声明,其中 androidx.appcompat 是域名部分,appcompat 是组名称,1.1.0 是版本号。gradle 在构建项目的时候会先检查本地是否有该库的缓存,如果没有才会去联网下载

想要卸载 AS 虚拟机的apk,可以直接在命令行中输入如:adb uninstall com.example.test 的命令

1.1.2 Androidmanifest.xml 文件

1.1.2.1 android:theme

在默认的初始项目中,每个活动最顶部都会有一个标题栏 ActionBar,这是因为默认初始化的情况下,AndroidManifest.xml 文件会指定一个 android:theme 属性,这个属性通常指向 res/values/styles.xml 文件,代码如下表示:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

这里定义了一个名叫 AppTheme 的主题,指定了它的 parent 主题是 Theme.AppCompat.Light.DarkActionBar。这里可以指定 parent 主题为 Theme.AppCompat.NoActionBarTheme.AppCompat.Light.NoActionBar,从而指定一个不带 ActionBar 的主题,前者表示将界面的主题颜色设置为深色,陪衬颜色为淡色,而后者反之。
item 标签表示的是重写的属性,除了以上属性,还可以通过以下属性来设置更多位置上的颜色:
在这里插入图片描述
其中 colorAccent 属性表达一个强调的意思,如一些控件被选中时就会显示这个颜色。

1.1.2.2 android:name

很多操作都是在活动中进行的,而活动本身就是一个 Context,所以一般不用愁。但当程序复杂起来,很多的逻辑代码都会脱离 Activity 类,而又需要用到 Context,比如说 Toast 方法,那么如何定义一个全局的 Context 以供获取呢?
Android 提供一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化,以便管理程序内一些全局的状态信息。
以下代码为自定义 Application 类:

public class MyApplication extends Application {
	private static Context context;
	
	@Override
	public void onCreate() {
		context = getApplicationContext();
	}

	public static Context getContext() {
		return context;
	}
}

此时还需要告知系统,当程序启动的时候应该启动的是自定义的 Application 类而不是默认的,这只需要在 AndroidManifest.xml 文件中的 application 标签下指定 android:name 属性即可,如:

<application android:name="top.seiei.test.MyApplication">
	...
</application>

这样就实现了一种全局获取 Context 的机制,此时不管在项目的任何地方使用 Context,只需调用以下 MyApplication.getContext() 方法即可。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐