基于Android Studio的行程记录APK开发指南(二):熟悉一个项目结构

news2024/9/23 7:20:28

前言

  • 最近博主在unity开发独立游戏,UE5系列的相关长期教程先暂时不更新了,请大家多多谅解
  • 本系列教程我们来看看如何使用Android Studio去开发一个APK用于用户的实时行程记录
    • 第一期:基于Android Studio的用户行程记录APK开发指南(一):项目基础配置与速通Kotlin-CSDN博客
  • 本期我们来看看一个基础的APP项目的项目架构

熟悉项目结构

  • 上一期我们快速了学会了如何新建一个项目和速通kotlin,我们这一小节来熟悉以下项目结构

  • 上一期在新建项目的时候,我们选择了Empty Activity,这一期为了接下来新手入门方便,我们选择Empty View Activity(下面会说明原因)请添加图片描述

  • 这是我们选择模板Empty View Activity所创建的一个项目,接下来我们来过一遍整个结构请添加图片描述


Activity
  • 在Android开发中,Activity是一个非常重要的组件,它代表用户可以与之交互的单个屏幕。一个Activity通常有一个用户界面,由布局文件定义,并通过XML文件进行配置。
    • 一般一个Activity通常由两个组件构成
      • class MainActivity : ComponentActivity()继承自ComponentActivity
      • res(resource)资源文件夹下的layout目录,我们可以找到Activity布局设计的XML文件
  • 值得一提的是,当你新建的是一个Empty Activity而非Empty View Activity时,res目录下并没有存在layout目录,你可以通过自行创建来完善(这也是推荐初学者选择Empty View Activity的原因)
  • 我们来关注新的MainActivity.kt
package com.example.pathrecorderapp  
  
import android.os.Bundle  
import androidx.activity.enableEdgeToEdge  
import androidx.appcompat.app.AppCompatActivity  
import androidx.core.view.ViewCompat  
import androidx.core.view.WindowInsetsCompat  
  
class MainActivity : AppCompatActivity() {  
    override fun onCreate(savedInstanceState: Bundle?) {  
        super.onCreate(savedInstanceState)  
        enableEdgeToEdge()  
        setContentView(R.layout.activity_main)  
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->  
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())  
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)  
            insets  
        }  
    }  
}
  • 这里我们关注两个上面所说的重要组成部分
  1. class MainActivity : AppCompatActivity() :MainActivity类继承自AppCompatActivity,这是Activity的一个扩展类,提供了更多的功能和兼容性支持.AppCompatActivity本身继承自ComponentActivity,它提供了对现代Android组件的支持。
  2. setContentView(R.layout.activity_main)setContentView()方法是Activity类的一个关键方法,它用于将布局资源(XML文件)设置到Activity中。R.layout.activity_main是一个资源ID,它引用了res/layout/activity_main.xml文件。我们点开指定路径,可以看到实例程序对应的UI界面设计在这里请添加图片描述
    请添加图片描述

Mainfest
  • AndroidManifest.xml:AndroidManifest.xml 是每个 Android 应用程序的核心配置文件。它位于项目的根目录中,描述了应用程序的组件,如 ActivityServiceBroadcastReceiverContentProvider,以及应用程序的权限、主题和所需的库。
  • 我们来看看这个文件的内容
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.PathRecorderApp"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  • <manifest> 标签是根元素,它包含了所有其他元素,并定义了应用程序的包名和版本信息。
  • <application> 标签包含了应用程序的组件、主题、图标和所需权限等。
    • android:allowBackup:是否允许备份和恢复应用程序数据。
    • android:icon:应用程序的图标。
    • android:label:应用程序的标签,通常在应用程序的启动器中显示。
    • android:roundIcon:应用程序的圆形图标,用于Android Wear设备。
    • android:supportsRtl:是否支持从右到左的文本。
    • android:theme:应用程序的主题。
  • <activity> 标签定义了应用程序中的一个活动(Activity)。
    • android:name:活动的类名。
    • <intent-filter>:定义了启动活动的方式。例如这里android.intent.action.MAINandroid.intent.category.LAUNCHER 表示这个活动是应用程序的入口点,当用户点击应用程序图标时,会启动这个活动。
  • 指定一提的,如果你的activity需要争取用户的权限,也需要在这里进行声明

kotlin+java
  • 这个文件夹我们目前需要关注的点就是下面我展开的这个文件夹,他包含了我们基础的MainActivity请添加图片描述

res

请添加图片描述

  • 在 Android 开发中,res 文件夹(资源文件夹)是项目中的一个重要目录,它包含了应用程序的资源文件,如布局、字符串、图片、颜色等。res 文件夹下的子目录分别用于存放不同类型的资源。
    • drawable 文件夹用于存放图像资源,如图标、按钮背景、菜单项等。这些图像可以是 PNG、JPG 或其他格式。

    • layout 文件夹用于存放定义用户界面的 XML 文件。这些 XML 文件描述了 Activity、Fragment 或对话框的布局结构,包括其中的视图(如按钮、文本框、图像视图等)及其属性。通过在 Activity 中调用 setContentView() 方法,可以将布局文件设置为 Activity 的内容视图。

    • mipmap 文件夹用于存放应用程序图标(Launcher icons)。

    • values 文件夹用于存放各种类型的值资源,如字符串、颜色、尺寸、样式和数组。这些资源通常以 XML 文件的形式存储,并且可以通过资源 ID 在代码中引用。例如,你可以在 strings.xml 文件中定义字符串资源,然后在布局文件或代码中通过 @string/resource_name 引用它们。请添加图片描述

    • xml 文件夹用于存放其他类型的 XML 资源,如搜索建议配置、设置偏好、菜单等。这些 XML 文件通常用于定义应用程序的特定功能或配置,如 searchable.xml 用于配置搜索界面,menu.xml 用于定义菜单项。


Gradle Scripts

请添加图片描述

  • Gradle 是 Android 项目中使用的自动化构建工具。它负责编译代码、打包 APK、运行测试以及执行其他构建任务。在 Android Studio 项目中,Gradle 构建脚本定义了项目的构建配置。
  • build.gradle 文件:每个 Android 项目至少有两个 build.gradle 文件:
    • 项目级 build.gradle:位于项目的根目录中,它定义了项目的全局配置,如项目的构建脚本版本、编译 SDK 版本、构建工具版本、依赖仓库和项目级别的依赖项。
    • 模块级 build.gradle:位于每个模块的目录中,它定义了模块的构建配置,如应用的编译 SDK 版本、目标 SDK 版本、最小 SDK 版本、版本号、依赖项和构建类型。
  • 这里我们关注 模块级 build.gradle(Module: app)
plugins {  
    alias(libs.plugins.android.application)  
    alias(libs.plugins.kotlin.android)  
}  
  
android {  
    namespace = "com.example.pathrecorderapp"  
    compileSdk = 34  
  
    defaultConfig {  
        applicationId = "com.example.pathrecorderapp"  
        minSdk = 24  
        targetSdk = 34  
        versionCode = 1  
        versionName = "1.0"  
  
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"  
    }  
  
    buildTypes {  
        release {  
            isMinifyEnabled = false  
            proguardFiles(  
                getDefaultProguardFile("proguard-android-optimize.txt"),  
                "proguard-rules.pro"  
            )  
        }  
    }    compileOptions {  
        sourceCompatibility = JavaVersion.VERSION_1_8  
        targetCompatibility = JavaVersion.VERSION_1_8  
    }  
    kotlinOptions {  
        jvmTarget = "1.8"  
    }  
}  
  
dependencies {  
  
    implementation(libs.androidx.core.ktx)  
    implementation(libs.androidx.appcompat)  
    implementation(libs.material)  
    implementation(libs.androidx.activity)  
    implementation(libs.androidx.constraintlayout)  
    testImplementation(libs.junit)  
    androidTestImplementation(libs.androidx.junit)  
    androidTestImplementation(libs.androidx.espresso.core)  
}
插件配置
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
}
  • 这里使用了 plugins 块来应用插件。alias 方法用于从项目级别的依赖库中引用插件。这里引用了两个插件:
    • libs.plugins.android.application:这是 Android 应用插件,用于配置 Android 应用模块。
    • libs.plugins.kotlin.android:这是 Kotlin Android 插件,用于支持 Kotlin 语言。
Android 配置
  • namespace:定义了应用的 Java 命名空间,用于生成 R 类和其他资源类。
  • compileSdk:指定了编译项目所需的 Android SDK 版本。
  • defaultConfig:包含了应用模块的默认配置,如 applicationIdminSdk(最低 SDK 版本)、targetSdk(目标 SDK 版本)、versionCode(版本代码)和 versionName(版本名称)。
  • testInstrumentationRunner:指定了用于运行 instrumentation 测试的测试运行器。
  • buildTypes:定义了不同的构建类型,如 releasedebug。在这里,release 构建类型被配置为不启用代码混淆(isMinifyEnabled = false),并指定了 ProGuard 规则文件。
  • compileOptions:配置了 Java 编译选项,这里设置了源兼容性和目标兼容性为 Java 8。
  • kotlinOptions:配置了 Kotlin 编译选项,这里设置了 JVM 目标版本为 1.8。
依赖配置
  • dependencies 块定义了项目所需的依赖项。这里使用了 implementation 依赖配置,它表示依赖项仅在编译时需要,不会打包到 APK 中。
  • libs 是一个可能位于项目根目录 buildSrc 中的库对象,它包含了项目依赖的版本号和库的映射。这样可以在一个地方管理所有依赖项,避免在多个 build.gradle 文件中重复配置。
  • 列出的依赖项包括 AndroidX 库、Kotlin 库、JUnit 测试库和 Espresso 测试库。

小结

  • 下一期我们讲提提如何使用XML设计基础的UI
  • 接下来博主会比较忙所以这一系列教程会以稍微短的形式分开完成,还请大家多多谅解
  • 如有错误欢迎指出

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

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

相关文章

CTF---密码学知识点总结

✨Ascall编码&#xff1a;在 ctf 比赛中&#xff0c;flag 的标志一般是以 Ascall 码的形式存在&#xff0c;其对应的码值为102&#xff0c;108&#xff0c;97&#xff0c;103&#xff08;其中{的码值是123&#xff09;&#xff01; ✨Unicode编码&#xff1a;又名万国码&#…

OpenHarmony持久化存储UI状态:PersistentStorage

前两个小节介绍的LocalStorage和AppStorage都是运行时的内存&#xff0c;但是在应用退出再次启动后&#xff0c;依然能保存选定的结果&#xff0c;是应用开发中十分常见的现象&#xff0c;这就需要用到PersistentStorage。 PersistentStorage是应用程序中的可选单例对象。此对…

海外云服务器安装 MariaDB10.6.X (Ubuntu 18.04 记录篇二)

本文首发于 秋码记录 MariaDB 的由来&#xff08;历史&#xff09; 谈起新秀MariaDB&#xff0c;或许很多人都会感到陌生吧&#xff0c;但若聊起享誉开源界、业界知名的关系型数据库——Mysql&#xff0c;想必混迹于互联网的人们&#xff08;coder&#xff09;无不知晓。 其…

C++中protobuffer的具体使用方法以及重要原理的实现

一、protobuffer的具体使用 对于基本的知识可以看我之前的文章。 那一片文章主要是知识点&#xff0c;这一片是实战。 1、头部 我们通过syntax 这个来指定版本号&#xff0c;如果不写的话就会默认为proto2&#xff0c;2这个版本是一个比较旧的版本。旧的版本写起来就比较繁琐。…

地平线Sparse4D论文解析(含论文原文)

0. 摘要 在自动驾驶感知系统中&#xff0c;3D 检测和跟踪是两个基本任务。本文深入研究了这一领域&#xff0c;并在 Sparse4D 框架的基础上进行了扩展。我们引入了两个辅助训练任务&#xff08;时间实例去噪和质量估计&#xff09;&#xff0c;并提出了解耦注意力机制&#xf…

智能计算方法与实现2|模拟退火算法原理|工具箱及其应用

模拟退火算法原理 模拟退火算法 模拟退火算法&#xff08;SimulatedAnnealing&#xff0c;SA&#xff09;最早的思想是由N.Metropolis等人于1953年提出。 1983年&#xff0c;S.Kirkpatrick等成功地将退火思想引l入到组合优化领域 它是基于Monte-Carlo送代求解策略的一种随机寻…

MATLAB 仿真跳频扩频通信系统

1. 简介 跳频扩频&#xff08;FHSS&#xff09;是一种通过在不同的频率之间快速切换来对抗窄带干扰的技术。在这篇博客中&#xff0c;我们将使用 MATLAB 进行 FHSS 通信系统的仿真&#xff0c;模拟跳频过程、调制、解调以及信号在不同步骤中的变化。通过对仿真结果进行可视化&…

为虚拟机配置固定的IP地址(CentOS9)

配置虚拟网卡 首先关闭虚拟机 打开虚拟网络编辑器 选择更改配置 选择VMnet8&#xff0c;选择子网的IP和掩码 &#xff08;这里的子网掩码为255.255.255.0&#xff0c;表示前24位为网络号&#xff0c;后8位为主机号&#xff09;然后点击DHCP设置 设置开始IP地址和结束IP地址&…

远端ide ,vscode ,python 开发环境, 有些还有一建生成chatgpt功能,支持gpu功能

现在智能化的AI工具&#xff0c;可以实现智能聊天、文本生成、语言翻译等多种功能。 博主归纳总结了6个好用免费的AI工具网站&#xff0c;供大家参考。 ## 1&#xff0c;insCode 网址&#xff1a; https://inscode.csdn.net/ 简介&#xff1a; InsCode 是一个以“灵感”&am…

【知识点】图论续篇 - 最短路算法合集

我不会跟大家说我两个月前就写好了&#xff0c;只是今天才发出来。 本文概述 最短路算法&#xff0c;见名知意&#xff0c;就是用于求出图中从某个顶点到另一个顶点最短距离的算法。最短路算法的应用极其广泛。本文将会以求解最短路为中心&#xff0c;围绕着展开叙述一些常见的…

高清无损!探索PDF转JPG的最佳实践工具

在信息爆炸的今天&#xff0c;PDF文件因其跨平台兼容性和文档保护特性&#xff0c;成为了工作、学习和日常生活中不可或缺的一部分。但是很多时候我们并不需要精度那么高的文件&#xff0c;图片分享更符合快捷的要求。这次我们就一起探讨有什么PDF转jpg的工具吧。 1.福昕PDF转…

SignalR——聊天室实践

SignalR 是一个为 ASP.NET 开发者设计的库&#xff0c;它简化了在 Web 应用程序中添加实时功能的过程。实时功能指的是服务器能够在客户端没有发起请求的情况下主动向客户端推送内容的能力。这种技术使得服务器和客户端之间的通信更加动态和即时&#xff0c;非常适合需要实时更…

iOS P8证书推送测试

最近在配合服务端人员调试相关的 APNS auth key 推送的问题&#xff0c;相比于苹果的P12证书的推送&#xff0c;P8证书的推送显得方便很多&#xff0c;P8的优势在于简单&#xff0c;安全 容易生成 最重要的是不会过期。 现在我们来看下测试具体流程&#xff1a; 方法一 地址…

Hive服务部署及Datagrip工具使用

目录 Hive服务部署 Hiveserver2服务 1&#xff09;用户说明 2&#xff09;Hiveserver2部署 &#xff08;1&#xff09;Hadoop端配置 &#xff08;2&#xff09;Hive端配置 3&#xff09;测试 &#xff08;1&#xff09;启动Hiveserver2 &#xff08;2&#xff09;使用命…

GoFly企业版里的阿里图标如何增加自定义图标到后台

1.在使用的vue页面引入图标组件 <script lang"ts" setup>import {Icon} from /components/Icon;</script> 2.在具体位置使用 <template><Icon icon"svgfont-icon7" class"iconbtn" :size"18" color"#ed6…

如何进行 AWS 云监控

什么是 AWS&#xff1f; Amazon Web Services&#xff08;AWS&#xff09;是 Amazon 提供的一个全面、广泛使用的云计算平台。它提供广泛的云服务&#xff0c;包括计算能力、存储选项、网络功能、数据库、分析、机器学习、人工智能、物联网和安全。 使用 AWS 有哪些好处&…

华为云全栈可观测平台(APM)8月新功能特性

华为云应用性能管理服务&#xff08;Application Performance Management&#xff0c;简称APM&#xff09;帮助运维人员快速发现应用的性能瓶颈&#xff0c;以及故障根源的快速定位&#xff0c;为用户体验保驾护航。 您无需修改代码&#xff0c;只需为应用安装一个APM Agent&a…

Linux/Ubuntu服务器 screen 安装与使用

一、screen简单介绍 在Linux系统中&#xff0c;screen是一个非常强大的终端仿真器&#xff0c;它允许用户在一个终端窗口中创建多个子窗口&#xff0c;每个子窗口都可以运行一个独立的会话。screen的主要特点包括&#xff1a; 会话分离&#xff1a;screen允许用户在终端会话中运…

lottie-web动画库实战详解

安装 npm install lottie-web pnpm install lottie-web yarn add lottie-web <divid"animation"style"width: 700px; height: 440px; margin-top: 80px"></div>import lottie from "lottie-web"; import loginJson from ".…

大零售时代:开源 AI 智能名片、2+1 链动与 O2O 商城小程序引领融合新趋势

摘要&#xff1a;本文深入探讨了当今零售业态的发展趋势&#xff0c;指出在数据匹配的时代&#xff0c;人依然在零售中发挥着重要作用。通过对大零售理念的阐述&#xff0c;分析了跨行业跨业态融合的必然性&#xff0c;强调了业态融合的指导思想以及实现方式。同时&#xff0c;…