(1)-Android学习笔记之:初识Android系统架构和项目结构
Android系统架构
Android程序结构
创建一个Android项目,为初学便于理解,将程序项目结构切换为Project模式,项目结构如下
.gradle和.idea:这两个目录下放的都是Android Studio自动生成的文件,无需我们关心,也不需要手动编辑。
app:项目中的代码、资源等内容几乎都放在这个目录下,开发工作基本在这个目录下进行。
libs:如果项目引用了第三方jar包,就需要吧这些jar包放在libs目录下,此目录下的jar包都会自动添加到构建目录中。
androidTest:此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
java:此目录防止我们所有Java代码的位置,展开此目录可看到新建此项目适的MyApplicationActivity文件就在里面。
res:这个目录下存放项目使用到的所有图片、布局、字符串等资源。
drawable开头:放图片,drawable和mipmap一样,只是没有自动生成,如果为了兼容各种设备,则需要自己新建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等文件夹,开发程序时最好将一张图片提供不同分辨率版本,分别放在这些文件夹下,运行时会自动根据当前设备分辨率高低选择加载哪个文件夹图片。如果只有一张图片,则将所有图片放在drawable-xxhdpi下也可以。
layout开头:放布局文件
mipmap开头:放应用图标。(有很多mipmap开头的文件,主要是为了让程序能更好兼容各种设备)
values开头:放字符串、样式、颜色等配置。
AndroidManifest.xml:整个Android项目配置文件,在程序中定义的所有四大组件都要在这个文件中注册,并还可以在文件中给应用程序加权限声明。
test:用来编写Unit Test测试用例,对项目自动化测试的另一种方式
.gitignore:用于将app模块指定的目录或文件排除在版本控制外,作用和外层的类似。
build.gradle:app木块的gradle构建脚本,此文件中会指定很多项目构建相关的配置。
prohiard-rules.pro:用于指定项目代码的混淆规则,当开发完成后打包成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解这难以阅读。
build:无需关心,包含了编译时自动生成的一些文件
gradle:包含gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否联网下载gradle,编译器默认没有启动,如果需要打开,可点击File--Settings--Build Execution,Deployment-Gradle进行配置更改。
.gitignore:这个文件是用来将制定的目录或文件排除在版本控制之外。
build.gradle:项目全局的gradle构建脚本,通常这个文件的内容不需要修改。
.gradle.properties:全局的gradle配置文件,此处配置的属性会影响项目中所有的gradle编译脚本。
gradlew和gradlew.bat:这两个文件用来在命令行界面执行gradle命令,其中gradlew是在Linux或Mac系统中使用的,gradle.bat实在windows系统中使用的。
local.properties:这个文件用于指定本机中的Android SDK路径,通常是自动生成的,不需要修改。除非本机中的Android SDK位置发生了变化。
MyApplication.iml:iml文件是所有IntelliK IDEA项目都会生成一个文件,(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,不需要修改这个文件的任何内容。
settings.gradle:这个文件用于指定项目中所有引用的木块。由于上图项目只有一个app模块,因此此文件也只引用了app这个模块。
Android项目文件分析
首先运行一下刚刚创建的项目。
活动Activity
打开AndroidManifest.xml项目配置文件,可以看到如下代码
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
此段xml代码表示对MainActivity这个活动进行注册,没有在此文件中注册的活动是不能使用的,其中intent-filter中的两行代码最为重要,<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />表示此活动是这个项目的主活动,打开程序首先看到的就是这个活动。
然后我们在main-java-中看看MainActivity.java类,可以看到继承自AppCompatActivity,这是一个向下兼容的Activity,可将各个系统版本增加的特性和功能最低兼容到Android2.1版本,Activity是Android系统提供的一个活动基类,项目中用到的所有活动都必须继承它或它的子类才能拥有活动的特性。然后可以看到有一个onCreate方法,这个方法是在活动呗创建时必定要执行的方法,其中只有两行代码,并没有看到Hello word!字样,那么上图运行时显式的Hello word!是怎么来的呢?
Android程序的设计讲究逻辑和视图分离,因此不推荐直接在活动中直接编写界面,而是在布局文件中编写界面,然后在活动中引用进来。如下代码,在onCreate方法第二行调用了setContentView(R.layout.activity_main),表示当前活动引入一个R/layout目录activity_main布局。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
打开res/layout目录,可以看到activity_main.xml文件,然后切换到Text模式,可以看到一个<TextView>标签下,有一行android:text="Hello World!"。
使用res下的资源
打开res/values/strings.xml文件,内容如下:
<resources>
<string name="app_name">My Application</string>
<string name="action_settings">Settings</string>
</resources>
此处定义了一个应用程序名的字符串,可以使用下面两种方式引用(其中string部分是可以替换的,如果引用图片资源则使用drawable,图标则是mpimap)
● 代码中使用R.string.app_name 可获得此字符串的引用
● xml中通过@string/app_name可以获得此字符串的引用。
详解build.gradle文件
Android使用gradle构建项目,其使用一种基于Groovy的领域特定语言(DSL)来声明项目配置,摒弃了传统的xml(如Ant和Maven)的各种繁琐配置。
前行必备-掌握日志工具的使用
abdroid中提供了一个日志工具类Log,其提供了如下几个方法共我们打印日志。
Log.v() 打印最琐碎、意义最小的日志信息,最低级别
Log.d()打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的,比Log.v()高一级。
Log.i()打印一些比较重要的数据,这些数据应该是你非常想看到的,可以帮助你分析用户行为,比Log.d()高一级。
Log.w()打印一些警告信息,提示程序在这个地方可能有潜在的风险,最好修复一下这些出现警告的地方,比Log.i()高一级。
Log.e()打印程序的错误信息,比如程序进入到catch语句中,当有错误信息打印出来时,一般都代表你的程序出现严重问题,必须尽快修复,最高级别。
例:在项目中测试使用。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
Log.d("MainActivity","onCreate excute");
Log.d()方法传入2个参数,第一个是tag一般传入当前类名,主要对打印信息进行过滤,第二个参数是msg,即想打印的具体内容。按shift+F10重新运行,可以看到日志窗口如下,日中不仅可以看到打印日志的内容和tag名,还可以看到程序包名、打印时间和程序的进程号。
(1)-Android学习笔记之:初识Android系统架构和项目结构的更多相关文章
- amazeui学习笔记二(进阶开发1)--项目结构structure
amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...
- Android学习笔记_51_转android 加载大图片防止内存溢出
首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...
- Android学习笔记:对Android应用进行单元测试
第一步:在AndroidManifest.xml中加入如下两段代码: <manifest xmlns:android="http://schemas.android.com/ap ...
- Android学习笔记之:android更新ui的几种经常用法
Android主线程不能运行耗时操作.我们通常是在子线程中运行耗时操作, 我们在运行完耗时操作后,我们一般能够通过下面几种方式来实现ui界面的更新. 首先是布局文件: <LinearLayout ...
- Windows Internals学习笔记(二)系统架构
参考资料: 1. <Windows Internals> 2. http://bestcbooks.com 3. Windows Drive Kit 4. Microsoft Window ...
- ROS学习笔记二:ROS系统架构及概念
本文主要是了解ROS的系统架构.文件夹结构以及工作所需的核心文件. ROS系统架构主要被设计和划分为三部分,每一部分代表一个层级的概念:文件系统级(The filesystem level).计算图级 ...
- Android学习笔记之,调用系统图库,添加自定义字体,屏幕截图
新年开始的第一天就来学习了慕课迎春活动中的Android心愿分享一课,学到了几个知识点,在此记录一下. 1.调用系统图库调用系统图库用的是intent,步骤为弹出系统图库选择器,选择图片后获取到所选择 ...
- Android学习笔记----解决“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”问题
同时在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件. 解决办法如下: 1.谷 ...
- 【K8S学习笔记】初识K8S 及架构组件
K8S是什么?发展历史 Kubernetes (简称 k8s)是 Google 在2014年开源的,对容器生命周期管理的开源平台,致力于对容器集群提供易于管理.高可用.弹性负载与故障转移的能力,提高服 ...
随机推荐
- window.location操作url对象
URL即:统一资源定位符 (Uniform Resource Locator, URL) 完整的URL由这几个部分构成:scheme://host:port/path?query#fragment s ...
- A——奇怪的玩意(POJ1862)
题目: 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板菌落.大部分的时间stripies在移动.当他 ...
- 【转】netty-transport版本冲突
Springboot整合Elasticsearch报错 今天使用SpringBoot整合Elasticsearch时候,相关的配置完成后,启动项目就报错了. nested exception is j ...
- C#中实现文件拖放打开的方法
C#中实现文件拖放打开的方法 设置Form属性 AllowDrop = True; 在Form事件中 private void Form1_DragDrop(object sender, DragEv ...
- 浅析设计模式之mvc、mvp、mvvm
mvc.mvvm.mvp是常见的设计模式,也是常见的设计思想,现对它们进行简要的归纳总结 三种模式的介绍 1.MVC:经典设计模式 View 传送指令到 Controller(控制器) Control ...
- 使用Ajax时[object%20object] 报错的解决方案
踩坑经过 最近初学Ajax,当我想把Ajax应用到自己项目中的时候,没有达到理想的效果,还报了如下错误: 点击图中报错,产生报错页面如下: 当时写的Ajax如下: // 提交修改密码表单 $(&quo ...
- 【redis】pipeline - 管道模型
redis-pipeline 2020-02-10: 因为我把github相关的wiki删了,所以导致破图...待解决.(讲真github-wiki跟project是2个url,真的不好用) 因为用的 ...
- Mysql 两种引擎的区别
MyISAM与InnoDB的区别是什么? 1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩 ...
- vs2015 编译boost库
1.下载boost官网安装包. https://dl.bintray.com/boostorg/release/1.66.0/binaries/ 注意:这里一定要选择好boost版本 如: boos ...
- python命令行工具的使用——argparse
argparse是一个常用的库函数,使用它的时候我们在命令行中不仅仅可以运行python文件,更可以零时调整参数,十分方便. 首先,如果你只是希望传一丢丢数据进去,那么只看下面两行就行了 import ...