3、Android项目结构分析

article/2025/8/5 4:21:10

Android项目结构分析

文章目录

  • Android项目结构分析
    • 一、文件系统结构
      • 1、项目配置清单文件夹 manifests
      • 2、源程序文件夹Java
      • 3、资源程序文件夹res
        • ①布局文件夹res/layout
        • ②值文件夹res/values
        • ③软件设计的国际化
        • ④图像文件夹res/drawable
        • ⑤声音文件夹res/raw
    • 二、创建多模块
    • 三、Android应用程序的基本组成
      • 1、Activity组件与视图View
      • 2、Service组件
      • 3、BroadcastReceiver组件
      • 4、ContentProvider组件
      • 5、Application、Context和Intent
        • ①应用对象Application
        • ②上下文对象Context
        • ③意图对象Intent
      • 6、Android应用程序的应用入口
      • 例:调用系统提供的拨号程序
    • 四、Android Studio项目调试
      • 1、主动调试(Toast与Logcat)
        • (1)Toast
        • (2)Logcat
      • 2、动态调试

一、文件系统结构

1、项目配置清单文件夹 manifests

每个Android项目都有一个名为AndroidManifest.xml的文件,包含了Android系统运行前必须掌握的相关信息,如应用程序名称、图标、应用程序的包名、组件注册信息和权限配置等。

2、源程序文件夹Java

Android以Java作为编程语言,因此其程序文件以.java作为扩展名。Java程序文件位于src文件夹的某个包内。

3、资源程序文件夹res

在Android项目中,有字符串、位图、布局等资源,可以将其划分为三种类型:XML文件、位图(图像)文件、raw(声音)文件。

在Android项目中,有两个用于存放资源文件的文件夹,分别为res和assets。其中,res文件夹内的资源文件最终被打包到编译后的.java文件中,res文件夹内不支持深度的子目录;assets文件夹中的资源文件不会被编译,而是直接打包到应用中,assets文件夹支持任意深度的子目录。res文件夹内的资源文件可以通过R资源类访问,而assets文件夹内的资源文件则不能。

①布局文件夹res/layout

布局文件夹res/layout用来存放扩展名为.xml的布局文件,由某种布局管理器管理的若干控件对象组成,供Activity组件使用。

②值文件夹res/values

值文件夹res/values里的strings.xml是非常重要的文件,通常存放着布局文件中控件对象的属性值。

③软件设计的国际化

国际化是指在软件设计过程中将特定语言及区域脱钩的过程,当软件移植到不同的语言及区域时,软件本身不需要做任何的修改。
Android SDK并没有提供给专门的API来实现国际化,而是通过对不同的资源文件进行不同的命名来达到国际化的目的 。

比如控件值来源于文件res/values/strings.xml,通过键名hello来引用,就是符合国际化的做法。如在布局文件中,定义文本框控件的代码:

<TextView ...android:text="@string/hello" />

如果不通过引用字符串变量的方式,而是直接把字符串常量写在TextView控件的android:text属性后,这种写法对程序运行没有任何影响,只是不符合国际化的做法,其代码如下:

<TextView ...android:text="字符串常量" />

④图像文件夹res/drawable

每个Android应用项目都有一个图标,默认使用的图标文件是ic_launcher是一个绿色的机器人,文件格式是.xml,存放在文件夹res/mipmap里。

更改Android应用默认图标的两种方法:
(1)右击mipmap→New→Vector Asset→Clip Art。
(2)先将.png格式的文件,复制到文件夹res/drawable中,然后通过R文件引用该图像文件。

⑤声音文件夹res/raw

项目使用的音频文件,通常存放在res/raw文件夹里。

二、创建多模块

在Android Studio开发中,有时希望把多个相关联的应用集合在一个项目里,使用Android Studio提供的多模块功能可以做到这一点。

在一个已经创建好的项目里,创建一个新模块的操作方法是:File→New→New Module。创建New Module的方法与创建项目的步骤基本相同,只是New Module的名称取代了项目名称。

创建项目时,自动生成的app实质上就是一个Module,它会调用后来创建的Module。在工具栏里,可以选择不同的Module单独进行调试和安装。

image-20201020190807221

三、Android应用程序的基本组成

根据Android应用程序的功能,组件可划分为四类核心组件:Activity、Service、BroadcastReceiver和ContentProvider。Android四大组件都需要在项目清单文件中使用相关标签进行注册。

1、Activity组件与视图View

Activity负责用户界面的设计,是Android最重要的组件。Activity用户界面框架采用MVC模式(Model View Controller)。控制器负责接受并响应程序的外部动作,通过视图反馈应用程序给用户的信息(UI界面反馈),模型是应用程序的核心,用于保存数据和代码。Activity组件在清单文件中使用标签注册

2、Service组件

Service是Android提供的无用户界面、长时间在后台运行的组件。Android提供了许多系统服务程序。Service组件在清单文件中使用标签注册。

3、BroadcastReceiver组件

在Android系统中,当有特定事件发生时就会产生相应的广播,如开机启动完成、收到短信、电量改变、网络状态改变等。

BroadcastReceiver(广播接收者)接收来自系统或其他应用程序的广播,并做出回应。BroadcastReceiver没有UI界面,在清单文件中使用标签注册。

4、ContentProvider组件

ContentProvider组件可以在无须了解数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作。ContentProvider组件在清单文件中使用标签注册。

5、Application、Context和Intent

①应用对象Application

当Android程序启动时系统会创建一个Application类型的对象,用来存储系统的一些信息完成数据传递、共享和缓存等操作。Application对象的生命周期是整个程序中最长的,等于这个程序的生命周期,且是全局的、单例的,即在不同的Activity和Service中获得的对象都是同一个对象。

②上下文对象Context

Activity和Service都是Context的子类,通过Context提供的方法getApplicationContext()就能获得Context对象。通过Intent对象,Activity组件之间可以相互调用,实现有参数传递或返回值的调用。

BroadcastReceiver和ContentProvider并不是Context的子类,其所持有的Context都是由其他组件传递过来的。在Activity和Service组件里发送广播,均需要使用Intent对象。

Android组件及通信机制如下图:

image-20201020194048544

③意图对象Intent

Intent是一种轻量级的进程间通信机制,让跨进程组件通信和发送系统广播成为可能,组件Activity、Service和BroadcastReceiver都是通过消息机制被启动(激活)的,其使用的消息就封装在对象Intent里。

Content是一个抽象类且是Activity的超类,提供了startActivity()方法,并以Intent对象作为参数,用于实现窗体的跳转。

在Android中,调用其他应用的动作名称由众多的类提供,也可以自定义。Android系统提供的常用意图动作名称如下表:

方法名功能描述
Intent.ACTION_MAIN标识Activity为一个程序的开始,参见清单文件中对主Activity的定义
Intent.ACTION_DIAL调用系统提供的拨号程序
Intent.ACTION_CALL呼叫指定的电话
Intent.ACTION_SENDTO发短信、E-Mail等
Intent.ACTION_VIEW浏览网页、地图、播放多媒体等
Intent.ACTION_WEB_SEARCH网络搜索
Intent.ACTION_BATTERY_CHANGED检查手机电量情况
Intent.ACTION_REQUEST_ENABLE蓝牙当前是否可用

6、Android应用程序的应用入口

在一个Android应用程序开始运行的时候,会单独启动一个进程(Process)。默认情况下,这个应用程序的所有组件都会运行在这个进程里。

一个Android应用程序通常由多个Activity组成,但只有一个主Activity。在项目清单文件中使用标签注册主Activity时,还需要内嵌、和标签,以此说明该Activity为应用程序的入口。以下代码是定义一个MainActivity.java为应用的主Activity代码:

<activity android:name="packname.MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>

例:调用系统提供的拨号程序

系统拨号程序可以理解为系统预先定义的一个Activity,通过Intent对象去激活,步骤如下:
(1)在项目的布局文件里,添加一个名为call_btn的Button控件
(2)在MainActivity程序的onCreate()方法里,添加如下代码:

//先找控件,后设置监听器(使用匿名内部类创建监听器对象)
findViewById(R.id.call_btn).setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){//创建意图对象Intent intent = new Intent();//调用系统的界面程序intent.setAction(Intent.ACTION_VIEW);//intent.setAction(Intent.ACTION_DIAL); //调用系统的拨号程序//根据数据类型打开相应的Activity(拨号程序)intent.setData(Uri.parse("tel:10086"));startActivity(intent);}
});

四、Android Studio项目调试

1、主动调试(Toast与Logcat)

(1)Toast

android.weiget.Toast类用于实现消息提醒,其信息在显示几秒后自动消失,只能以程序代码的方式设计。

Toast的静态方法makeText(Context,CharSequence,int)用于创建一个Toast对象,三个参数分别为:
①上下文对象,表示在哪个Activity里显示
②要显示的字符串信息
③显示的时长,可使用类常量Toast.LENGTH_LONG或Toast.LENGTH_SHORT,也可使用以毫秒为单位的正整数

通常先使用makeText()方法创建一个Toast对象,再使用show()方法显示某个Activity。在使用show()前,可以使用setGravity(int,int,int)方法设置显示位置,如果不设置,则默认出现在手机屏幕偏下的位置。

Toast.makeText(this,"显示信息",Toast.LENGTH_LONG).show(); //this表示当前Activity的上下文

(2)Logcat

Android系统运行应用程序时会产生一些日志(Log)信息,按照级别从低到高的顺序划分为Verbose(详细)、Debug(调试)、Information(信息)、Warning(警告)和Error(错误)等不同级别。

如果Android程序运行时闪退,则表明程序遇到了致命的错误。打开Logcat控制台,选择日志级别为Error,可获取错误信息。也可以通过查看Run控制台,找到出错的原因。

image-20201020202527892

Log是一个Android类,提供了产生不同级别日志信息,方法有v(string,string)、d(string,string)、i(string,string)、w(string,string)、e(string,string)。其中第一个参数是用户自定义方便筛选的标签,第二个参数是需要输出的信息。

2、动态调试

在Android Studio环境中,也可以通过设置断点、检查变量值的方式来检查错误,适用于程序错误的快速精确定位。

单击某行行号阴影区域即可设置断点,将产生一个断点标记。再次点击可以取消。

image-20201020203141160

点击工具栏上的爬虫图标,将以Debug方式运行程序,在各个断点处暂停程序运行并显示内存变量值。单击向下图标,可以以单步方式运行程序。

image-20201020203339781

image-20201020203407506


本篇文章参考书籍有:
《Android Studio移动开发教程》 肖坤——电子工业出版社,2019.1


作者:阿涛
CSDN博客主页:https://blog.csdn.net/qq_43313113
如有不对的地方,欢迎在评论区指正
欢迎大家关注我,我将持续更新更多的文章



http://chatgpt.dhexx.cn/article/ayoVcS2T.shtml

相关文章

Android | 序列化Serializable/Parcelable 使用总结

本文已同步发表于我的微信公众号&#xff0c;搜索 代码说 即可关注&#xff0c;欢迎与我沟通交流。 文章目录 一、什么是序列化&#xff1f;为什么要序列化&#xff1f;怎么进行序列化&#xff1f;二、Serializable2.1 序列化举例2.2 重写readObject、writeObject、readResolve…

Android应用程序设计——入门配置

第一章:Android简介与项目部署 版权声明: 本文为博主学习整理原创文章,如有不正之处请多多指教。 未经博主允许不得转载。https://mp.csdn.net/postedit/81837814 Android由来Android又称“机器人”,版权归google公司所有。是Google于2007年11月5日宣布的基于Linux平台的…

Android程序设计基础 • 【第1章 Android程序入门】

全部章节 >>>> 本章目录 1.1 Android 平台介绍 1.1.1 Android 简介 1.1.2 Android 平台的发展 1.1.3 Android 平台架构 1.2 搭建 Android 开发环境 1.2.1 下载和配置 Android Studio 1.2.2 初始化配置 Android Studio 1.2.3 配置和使用 Genymotion 模拟器…

Android自动化的一般方法

1 背景 https://mp.weixin.qq.com/s/B7o3JSkYI_9c4RivatsZKQ Android自动化包含自动化测试和第三方App的自动化运行&#xff0c;这里的自动化测试主要指的是纯粹的黑盒测试&#xff0c;即在完全不了解代码逻辑的情况下编写的测试用例&#xff0c;可以代替人工完成重复性的工…

基于Android的点餐系统设计与实现

目 录 摘 要 2 ABSTRACT 3 目 录 1 1 绪 论 1 1.1课题研究背景和意义 1 1.2课题可行性分析 2 1.3论文框架安排 3 2 开发语言说明 4 2.1 开发工具及环境简介 4 2.2 Android系统 5 2.2.1 Android Features特性 5 2.2.2 Android系统的四大组件 6 3 点餐系统分析 8 3.1概述 8 3.1.1…

基于Android的记账本的设计与实现

1.基于Android平台的记账系统概述 记账就是按照生活中的发生的经济活动&#xff0c;及时进行记录&#xff0c;为了便于分析个人消费和各种财务状况等等&#xff0c;通过您的随身会计——记账本APP更易看出资金的流动方向。 本论文采用的是一种可移动的记账方法&#xff0c;由移…

Android设计模式之——模板方法模式

一、介绍 在面向对象开发过程中&#xff0c;通常会遇到这样的一个问题&#xff0c;我们知道一个算法所需的关键步骤&#xff0c;并确定了这些步骤的执行顺序&#xff0c;但是&#xff0c;某些步骤的具体实现是未知的&#xff0c;或者说某些步骤的实现是会随着环境的变化而改变…

Android程序设计基础

#Android应用程序架构 Android程序的入口被称为Main Activity&#xff0c;带有界面的Android应用程序一般需要从Main Activity启动。 目录结构 Adnroid工程主要包括两个区域&#xff1a;源码区和资源区。 Mainifest.xml 下面是一个标准的AndroidManifest.xml文件样例。 <…

qt如何编写android程序,如何利用Qt开发Android应用程序

Qt 工具箱是一个使用广泛的跨平台GUI工具箱,可用于 Windows、Linux、Mac OSX 和许多手持平台。QT 具有良好结构化(但灵活)的面向对象的结构、清晰的文档以及直观的 API。 Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows、跑linux、跑MAC……如今移动平台Andr…

Android插件化方案实践

一、插件化概述 1、插件化和组件化的区别 组件化是将一个app拆分为多个模块进行协作开发&#xff0c;每个模块都是一个单独的组件&#xff0c;这些组件可以相互依赖&#xff0c;也可以单独调试运行。但是最终发布的时候&#xff0c;这些组件会合并在一起&#xff0c;组成一个整…

Android手机开发课程设计之记事本

一、需求分析 1.1业务需求分析 近年来&#xff0c;随着生活节奏的加快&#xff0c;工作和生活的双重压力全面侵袭着人们&#xff0c;如何避免忘记工作和生活中的诸多事情而造成不良的后果就显得非常重要。为此我们开发一款基于Android系统的简单记事本&#xff0c;其能够便携…

MATLAB图形绘制--添加图例

添加图例 专业的图像总是附有图例来告诉读者曲线表示什么&#xff0c;下面我们将绘制两个表示势能的函数&#xff0c;他们由双曲三角函数sinh(x)和cosh(x)来定义&#xff0c;X的定义域为0&#xff5e;2&#xff0c;首先我们定义X&#xff1a; >> x [0:0.01:2];然后表示…

matlab 图例自定义,matlab中如何自定义图例_常见问题解析

pd接口是什么口_常见问题解析 pd接口也是“Type-C”的接口&#xff0c;支持扩充协议&#xff0c;可以给手机笔记本充电&#xff0c;也可以传输数据&#xff1b;而“Type-C”中的PD的意思指的是“USB Power Delivery”功率传输协议。 matlab中如何自定义图例&#xff1f;Matlab如…

Matlab 画多个图例( Plot multiple legends )

用matlab 画图时&#xff0c;发现线太多&#xff0c;生成的图例&#xff0c;遮盖了曲线。于是想画成多个图例&#xff0c;然后可以自由拖动。 废话不多说&#xff0c;2&#xff09;代码&#xff08;设置多个图例的部分在最后20行&#xff09;&#xff1b; 1&#xff09;效果。 …

matlab之图例legend的数字变量显示

legend是matlab的图例使用函数&#xff0c;其主要的只用方式为legend(内容1,内容2) 本文主要介绍一下legend如何引用数组的数字表现形式。 例如&#xff0c;若想要画一个滤波器的不同反馈系数的频率响应曲线&#xff0c;在设置条例内容时&#xff0c;需要手动输入反馈系数K的数…

MATLAB图例变成一列变多列的方法

小编在绘制GPS数据图像时&#xff0c;发现图例中元素个数有31个&#xff0c;当采用默认生成图例时&#xff0c;只有一列图例&#xff0c;显示结果如下 图例非常难看&#xff0c;而且占位子&#xff0c;如何让图例从一列变成多列呢&#xff1f; 这里小编给大家提供一个思路&…

matlab把图例放在左边,如何将图例放在p之外

如何将图例放在p之外 我有一系列20个图(不是子图)可以在一个图中制作。 我希望传说能够超越盒子。 与此同时,我不想改变轴,因为图形的大小减少了。 请帮助我以下查询: 我想将情节框保留在情节区域之外。 (我希望传说位于情节区域的右侧)。 无论如何,我减少了图例框内文本的…

matlab之在坐标区上添加图例函数legend

目录 一、功能 二、语法 1.legend(label1,...,labelN) 2.legend(labels) 3.legend(subset,___) 4.legend(target,___) 5.legend(___,Location,lcn) 6.legend(___,Orientation,ornt) 7.legend(___,Name,Value) 8.legend(bkgd) 9.lgd legend(___) 10.legend(v…

Matlab作图后的各种调整方法——线条、坐标、标题、图例

Matlab作图后的各种调整方法——线条、坐标、标题、图例 文章目录 Matlab作图后的各种调整方法——线条、坐标、标题、图例一 &#xff0c; 写在前面1.整个图窗 Figure&#xff08;gcf&#xff09;2.我们使用命令做出的线条 Line&#xff0c;例如plot命令3.坐标轴 Axes (gca) 二…

Matlab图例Legend多行排布、字体格式

适用于图例文字多&#xff0c;简单排布效果差的情形 1. 绘制图形&#xff0c;添加图例 %数据 x[1 2 3 4]; y1[16 2 3 13]; y2[5 11 10 8]; y3[9 7 6 12]; y4[4 14 15 1]; %画图plot(x,y1,r-o); %红色&#xff0c;实线&#xff0c;圆圈 hold on; plot(x,y2,k-d…