三、Android项目结构分析

Android项目结构分析

做者:阿涛
CSDN博客主页:https://blog.csdn.net/qq_43313113


java

1、文件系统结构

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

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

二、源程序文件夹Java

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

三、资源程序文件夹res

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

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

①布局文件夹res/layout

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

②值文件夹res/values

值文件夹res/values里的strings.xml是很是重要的文件,一般存放着布局文件中控件对象的属性值。框架

③软件设计的国际化

国际化是指在软件设计过程当中将特定语言及区域脱钩的过程,当软件移植到不一样的语言及区域时,软件自己不须要作任何的修改。
Android SDK并无提供给专门的API来实现国际化,而是经过对不一样的资源文件进行不一样的命名来达到国际化的目的 。
编程语言

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

<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文件夹里。

2、建立多模块

在Android Studio开发中,有时但愿把多个相关联的应用集合在一个项目里,使用Android Studio提供的多模块功能能够作到这一点。

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

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

image-20201020190807221

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

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

一、Activity组件与视图View

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

二、Service组件

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

三、BroadcastReceiver组件

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

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

四、ContentProvider组件

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

五、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 蓝牙当前是否可用

六、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(){ 
    @Override
    public 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);
    }
});

4、Android Studio项目调试

一、主动调试(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)。其中第一个参数是用户自定义方便筛选的标签,第二个参数是须要输出的信息。

二、动态调试

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

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

image-20201020203141160

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

image-20201020203339781

image-20201020203407506

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

相关文章
相关标签/搜索