Android入门(二) | 项目目录及主要文件作用分析

文章目录

  • 项目目录分析
  • app目录分析
  • AndroidManifest.xml 分析
  • MainActivity.kt 分析
  • build.gradle 分析
    • 最外层目录下的 build.gradle
    • app 目录下的 build.gradle


项目目录分析

我们来看一下 src/main/res 下的一些文件:
在这里插入图片描述

  • .gradle.idea :这两个目录下放置的都是 Android Studio 自动生成的一些文件,我们无须关心,也不要去手动编辑。
  • .app:项目中的代码、资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的。
  • build:主要包含了一些在编译时自动生成的文件。
  • gradle:包含了 gradle wrapper 的配置文件,使用 gradle wrapper 的方式不需要提前将 graqe 下载好,而是会自动根据本地的缓存情况决定是否需要联网下载 gradle。Android Studio 款认没有启用 gradle wrapper 的方式,如果需要打开,可以点击 Android Studio导航栏→File–>Settings→Build,Execution, Deployment→Gradle,进行配置更改。
  • .gitignore:这用来将指定的目录或文件排除在版本控制之外。
  • build.gradle:项目全局的 gradle 构建脚本,通常这个文件中的内容是不需要修改的。
  • gradle.properties:全局的 gradle 配置文件,在这里配置的属性将会影响到项目中所有的 gradle 编译脚本。
  • gradlewgradlew.bat:这两个文件是用来在命令行界面中执行 gradle 命令的,其中 gradlew 是在 Linux 或 Mac 系统中使用的,gradlew.bat 是在 Windows 系统中使用的。
  • local.properties:用于指定本机中的 Android SDK 路径,通常内容都是自动生成的、并不需要修改。除非你本机中的 Android SDK 位置发生了变化,那么就将这个文件中的路径改成新的位置即可。
  • settings.gradle:这个文件用于指定项目中所有引入的模块。由于本项目中就只有一个 app 模块,因此该文件中也就只引入了 app 这一个模块。通常情况下模块的引人都是自动完成的,需要我们手动去修改这个文件的场景可能比较少。

app目录分析

在这里插入图片描述

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

举个例子,打开 res/values/strings.xml 文件:

<resources><string name="app_name">Hello Android</string>
</resources>

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

  • 在代码中通过 R.string.app_name 可以获得该字符串(intent-test)的引用。
  • 在 XML 中通过 @string/app_name 可以获得该字符串(intent-test)的引用。

其中 string 部分是可以替换的,如果是引用的图片资源就可以替换成 drawable,如果是引用的应用图标就可以替换成 mipmap,如果是引用的布局文件就可以替换成 layout,以此类推。


AndroidManifest.xml 分析

在这里插入图片描述

  • android:allowBackup 属性:Android 2.2中引入的一个系统备份的功能。允许用户备份系统应用和第三方应用的 apk 安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过 adb backup 和 adb restore 来进行对应用数据的备份和恢复。
  • android:icon 属性:指定项目的应用图标。
  • android:label 属性:指定应用的名称。这里对资源引用的方式正是上面讲 strings.xml 文件时提到的在 XML 中引用资源的语法。
  • android:roundIcon 属性:与 android:icon 类似,只是指定项目的圆形图标,适配为 Android 8.0 新增的 mipmap-anydpi-v26 。(详情见:application中 android:icon 和 android:roundIcon 的区别)
  • android:supportsRtl 属性:声明项目是否支持从右到左(RTL,Right-to-Left)的布局。从 Android 4.2 开始,Android SDK 支持一种从右到左(RTL,Right-to-Left)UI布局的方式,尽管这种布局方式经常被使用在诸如阿拉伯语、希伯来语等环境中,中国用户很少使用。
  • android:theme 属性:指定项目的主题。(详情见:Android Theme 常见主题风格详解)
  • <activity/>:表示对 MainActivity 进行注册,没有注册的活动是不能使用的。
    1. android:name 指定具体注册哪一个活动,由于最外层的 <manifest> 标签中已经通过 package 属性指定了用户的包名,所以用 . 表示省略包名。
    2. android:label 指定活动中的标题栏的内容。需要注意的是,给主活动指定的 label 不仅会成为标题栏,而且还会成为 Laucher 中应用程序的名称。
    3. intent-filter 是拦截器,定义了整个项目的主 Activity,其中的 <action …… /><category …… /> 两行语句定义该活动为程序的主活动。打开应用首先启动的就是这个活动。
    4. 如果一个程序没有主活动,那么一般这样的程序都是作为第三方服务供其他应用在内部进行调用的。

MainActivity.kt 分析

MainActivity.kt 是用 kotlin 实现的代码文件,可以类比于 C++/JAVAmain 文件/函数:
在这里插入图片描述
上图红框的意义是:MainActivity 继承了 AppCompatActivity

那么什么是 AppCompatActivity 呢?

AppCompatActivityAcitivity 的子类。Android 21(也就是 Android 5)之后引入了 Material Design 的设计方式,为了支持 Material Color 、调色板、toolbar 等各种新特性,AppCompatActivity 就应运而生,其不仅兼容旧有的 ActionBarActivity,更是引入了AppCompatDelegate 类的设计,可以在普通的 Acitivity 中使用 AppCompate 的相关特性。

那么什么是 Acitivity 呢?

Activity类Android 提供的一个基类,项目中所有程序员自定义的 Activity 都必须继承 基类Activity 或者 基类Activity的子类,从而获得一个 Activity 的特性。

onCreateCreate

view类 中,Create 是虚函数、由框架调用,用来 生成一个窗口的子窗口。 而 OnCreate 函数是用来表示 一个窗口正在生成,是一个活动被创建时必定要执行的方法。

一个窗口创建(Create)之后,会向操作系统发送 WM_CREATE 消息,OnCreate() 函数主要是用来响应此消息的,因此又被叫做消息响应函数。其只是在窗口显示前设置窗口的属性,如风格、位置颜色等;实现我们要在窗口里面增加的东西,例如按扭,状态栏,工具栏等。这些子窗口一般定义成类中的一个成员变量,以保证生命周期的正确性。

AndroidBundle类 的作用.

Bundle类 类似于 Map,用于存放 key-value 键值对形式的值。相对于 Map,它提供了各种常用类型的 put/get 方法,如:putString()/getString()putInt()/getInt()put() 用于往 Bundle 对象放入数据,get() 方法用于从 Bundle 对象里获取数据。Bundle 的内部实际上使用了 HashMap类型 的变量来存放 put() 方法放入的值。

savedInstanceStateonSaveInstanceState()

Activity 的生命周期中,只要离开了可见阶段,或者说失去了焦点,Activity 就很可能被进程 KILL 掉,这时候,就需要一种能保存当时的状态的机制—— savedInstanceState 。当一个 Activity 在 PAUSE 时,被 KILL 之前,它可以调用 onSaveInstanceState() 来保存当前 Activity 的状态信息。用来保存状态信息的 Bundle 会同时传给两个 method,即 onRestoreInstanceState()onCreate()

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {// override 确保该函数(即onCreate)为基类(即Activity)的虚函数并在此进行重写。super.onCreate(savedInstanceState)// 调用其父类Activity的onCreate方法来实现对界面的图画绘制工作。// 其实这条语句放在子类中的onCreate方法中的任何位置都可,问题只是该语句必须要被执行,所以,最好放在第一行,避免遗忘。// Activity中的onCreate方法中已经实现了一些基本操作,如果子类没有缺少super.onCraete,会导致子类中的onCreate方法功能不全。setContentView(R.layout.activity_main)// 作用:加载一个界面。Android讲究逻辑与视图分离,所以在Activity是不写界面的,界面是放在局部文件里面的。// 该方法中传入的参数是”R.layout.activity_main“,其含义为R.java类中静态内部类layout的静态常量activity_main的值,// 而该值是一个指向res目录下的layout子目录下的activity_main.xml文件的标识符,// 因此代表着显示activity_main.xml所定义的画面/布局。}
}

我们来看一下上面代码提到的 activity_main.xml
在这里插入图片描述

  • <TextView/> :该控件用于在布局中显示文字。

build.gradle 分析

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

在上文我们提到项目中有两个 build.gradle 文件,一个是在最外层目录下的,一个是在 app 目录下的。

最外层目录下的 build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {repositories {google()jcenter()}dependencies {classpath "com.android.tools.build:gradle:4.1.3"// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}allprojects {repositories {google()jcenter()}
}task clean(type: Delete) {delete rootProject.buildDir
}
  • repositories 闭包:声明项目托管的仓库。
    1. jcenter() 配置:是一个代码托管仓库,很多 Android 开源项目都会选择将代码托管到 jcenter 上,声明了这行配置之后,我们就可以在项目中轻松引用任何 jcenter上的开源项目了。
  • dependencies 闭包:声明项目的依赖关系。
    1. classpath 环境变量:因为 Gradle 并不是专门为构建 Android 项目而开发的,Java、C++ 等很多种项目都可以使用 Gradle 来构建。因此如果我们要想使用它来构建 Android 项目,则需要声明 com.android.tools.build:gradle:4.1.3 这个插件。数字部分是插件的版本号。

app 目录下的 build.gradle

plugins {id 'com.android.application'
}android {compileSdkVersion 30buildToolsVersion "30.0.0"defaultConfig {applicationId "com.example.intent_test"minSdkVersion 16targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'com.google.android.material:material:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
  • plugins 闭包:有两种插件可供选择 —— 'com.android.application' 表示这是一个应用程序模块,可以直接运行;com.android.library 表示这是一个库模块,只能依附别的应用程序模块来运行。
  • android 闭包:
    1. compileSdkVersion :用于指定项目的编译版本,这里指定成 30 表示使用 Android 11.0 系统的 SDK 编译。
    2. buildToolsVersion:用于指定项目构建工具的版本。
  • android 闭包内嵌的 defaultConfig 闭包:
    1. applicationId :用于指定项目的包名,在创建项目的时候其实已经指定过包名了,如果后续想对其进行修改,那么就是在这里修改的。
    2. minSdkversion :用于指定项目最低兼容的 Android 系统版本,这里指定成 16 表示最低兼容到 Android 4.1 系统。(具体设置应该根据下载的模拟器)
    3. targetSdkVersion :应用程序会启用指定版本上最新的功能和特性。比如说 Android 6.0 系统中引人了运行时权限这个功能,如果你将 targetSdkVersion 指定成 23 或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将 targetSdkVersion 指定成 22,那么就说明你的程序最高只在 Android 5.1 系统上做过充分的测试,Android 6.0 系统中引入的新功能自然就不会启用了。
    4. versionCode :用于指定项目的版本号。
    5. versionName :用于指定项目的版本名。
    6. testInstrumentationRunner :指定测试模块。
  • buildTypes 闭包:用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是 debug,一个是 release。debug 闭包用于指定生成测试版安装文件的配置,release 闭包用于指定生成正式版安装文件的配置。另外,debug 闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个 release 闭包。
  • release 闭包:
    1. minifyEnabled :用于指定是否对项目的代码进行混淆,true 表示混淆,false 表示不混淆。
    2. proguardFiles :用于指定混淆时使用的规则文件,这里指定了两个文件,第一个 proguard-android-optimize.txtproguard-android.txt 的功能增加版本,在 Android SDK 目录下,里面不仅包含所有项目通用的混淆规则,而且开启了 Proguard optimize 的功能;第二个 proguard-rules.pro 是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。
  • compileOptions 闭包:用于调试跟踪和测试。
  • dependencies 闭包:可以指定当前项目所有的依赖关系。通常 Android Studio 项目一共有 3 种依赖方式:
    1. 本地依赖可以对本地的 Jar 包或目录添加依赖关系;
    2. 库依赖可以对项目中的库模块添加依赖关系;
    3. 远程依赖则可以对 jcenter 库上的开源项目添加依赖关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android入门(三) | Android 的日志工具 Logcat

文章目录日志工具类 android.util.LogLogcat 中的过滤器日志工具类 android.util.Log Log 从属日志工具类 android.util.Log &#xff0c;该类提供了五个方法供我们打印日志&#xff1a; Log.v() &#xff1a;用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose&…

Android入门(五) | Activity 的生命周期

文章目录Activity 的状态及生命周期实现管理生命周期FirstActivitySecondActivityDialogActivity运行结果旧活动被回收了还能返回吗&#xff1f;Activity 的状态及生命周期 Android 的应用程序运用 栈&#xff08;Back Stack&#xff09; 的思想来管理 Activity&#xff1a; …

Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

文章目录Activity 的启动模式standardsingleTopsingleTasksingleInstance技巧了解当前界面是哪个 Activity随时随地退出程序启动活动的最佳写法Activity 的启动模式 standard&#xff1a;默认的启动方式&#xff0c;每次启动一个活动都会重新创建singleTop&#xff1a;如果该活…

Android入门(七) | 常用控件

文章目录TextView 控件&#xff1a;文本信息Button 控件&#xff1a;按钮EditText 控件&#xff1a;输入框ImageView 控件&#xff1a;图片ProgressBar 控件&#xff1a;进度条AlertDialog 控件&#xff1a;提示框ProgressDialog 控件&#xff1a;带有进度条的提示框TextView 控…

Android入门(八) | 常用的界面布局 及 自定义控件

文章目录LinearLayout &#xff1a;线性布局android:layout_gravity &#xff1a;控件的对齐方式android:layout_weight&#xff1a;权重RelativeLayout &#xff1a;相对布局相对于父布局进行定位相对于控件进行定位边缘对齐FrameLayout &#xff1a;帧布局Percent &#xff1…

Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限&#xff0c;能够一次性在屏幕上显示的内容不多&#xff0c;当我们的程序有大量数据需要显示的时候就可以借助 ListView 来…

Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片&#xff08;Fragment&#xff09;实例布局文件FragmentActivity动态添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期为什么要使用碎片&#xff08;Fragment&#xff09; 我们在手机上看新闻可能是这样的&#xff1a; Re…

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…

Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播广播接收器AndroidManifest.xml运行结果功能简介 强制下线功能只需要弹出一个对话框&#xff0c;让用户只能点击确定按钮&#xff0c;回到登录界面。 如果在每一个活动中添加一个对话框的话太过繁琐&#xff0c;用广播…

Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储将数据存储进文件实例从文件中读取数据实例实现记住密码的功能SQLite数据库存储创建自己的帮助类调用自己的帮助类补全 onUpgrade() 方法增删查改增&#xff1a;SQLiteDatabase.inser…

Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器运用安卓封装好的内容提供器自实现的内容提供器概念实现普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上&#xff0c;实现数据共享的功能。 在 Android 6.0 开始引入了运行时权限的功能&…

Android入门(14)| 通知

文章目录创建通知点击效果其它小功能实例创建通知 创建通知的步骤&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通过当前 Context 的 getSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。Android 8.0(O) 版本后需要通知通道&…

Android开发(3) | 权限和内容提供器的应用——调用相机和相册

文章目录拍照并保存到 ImageView 控件布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作隐式 Intent 启动后的回调AndroidManifest.xml从相册选取照片并在 ImageView 控件中显示布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作自定义打开相册的方法 op…

Android开发(4) | 系统权限、MediaPlayer类 和 VideoView类 的应用——播放多媒体文件

文章目录MediaPlayer类播放音频的实例VideoView类播放视频的实例MediaPlayer类 对多种格式的音频文件提供了全面的控制方法&#xff1a; 如何获得MediaPlayer实例&#xff1f; 通过构造函数&#xff1a; MediaPlayer mp new MediaPlayer();调用 MediaPlayer.create() 方法&…

Android入门(15)| 网络

文章目录WebViewHTTP使用HttpURLConnection使用OkHttp封装网络操作封装HttpURLConnection封装OkHttpWebView WebView 可以在 应用程序中&#xff08;而不是浏览器&#xff09; 展示一些网页。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Android入门(16)| 服务

文章目录概念Android 多线程继承 Thread继承 Runable 接口匿名类异步消息处理AsyncTask使用服务框架启动/停止服务绑定/解绑服务服务的生命周期前台服务IntentService完整版下载示例下载过程的回调接口&#xff1a;DownloadListener继承 AsyncTask 实现下载功能&#xff1a;Dow…

2020德勤面试开始了吗_2020国考面试开始,近期面试公告汇总,附结构化小组面试流程...

2020年国家公务员考试面试环节逐步恢复考试&#xff0c;各个招录部门已经发布面试考察公告&#xff0c;对于进入面试环节的国考考生来说&#xff0c;有必要了解近期国考面试的招录动态&#xff0c;提前做好面试准备。2020国考国家统计局机关面试面试确认&#xff1a;请进入面试…

项目积压需求项目计划_需求变更频繁,项目经理如何做好需求管理?

项目实施过程中&#xff0c;项目经理常常面临一个重大挑战——需求变更。需求变更无处不在&#xff0c;市场条件变化、新业务出现、战略目标调整、客户需求修改、资源限制等&#xff0c;都会造成需求变更。需求变更会影响项目的时间、成本和质量&#xff0c;对整个项目和团队成…

Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法

文章目录概述getOrientation 方法根据 旋转矩阵R 获取 设备旋转弧度getRotationMatrix 方法根据 地磁场、加速度传感器对象 获取 旋转矩阵R代码参考资料概述 Sensor.TYPE_ORIENTATION 常数在 API 8 中已弃用&#xff0c;官方推荐使用 SensorManager.getOrientation() 替代。关…