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名,还可以看到程序包名、打印时间和程序的进程号。