我写的第一行代码

今天学习成果

了解了安卓的项目目录和基本的结构

Android项目结构(先略过,暂时还没讲解到)

主要了解的是Project项目结构

1  .gradle和.idea

里面都是系统生成的一些文件暂时还不需要了解

2 app目录这个目录非常重要里面包括以下内容

(留到后面详细讲解)

3 build

目录包含了编译时自动生成的文件

4 gradle

包含了gradle wrapper 的配置文件

5 .gitignore文件

用来将指定的目录或者文件排除再版本控制之外(暂未学习)

6 build.gradle

项目全局的gradle构建脚本(后面讲解里面的具体内容)

7 gradle.properties

全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本

8 gradlew和gradlew.bat

这两个文件是用来在命令行界面执行gradle命令的,其中gradlew是在Linux或Mac系统

中使用的,gradlew.bat是在Windows系统中使用的

9 Hello World Application.iml

iml 文件是所有 Intellij IDEA项目都会自动生成的一个文件,用于标识这是个

Intellij IDEA 项目

10 local.properties

这个文件用于指定本机中的Android SDK 路径,通常内容都是自动生成的,不需要修改

假如本机中的Android SDK 位置发生了改变,那么将这个文件的路径改成新的位置即可

11setting.gradle

这个文件用于指定项目中的所有引入的模块

--------------------------------------外层目录介绍完毕-----------------------------------------

下面进行app目录的详细讲解

app目录包括以下内容

 1 build

目录包含了编译时自动生成的文件和外层的build目录类似

2 libs

假如你的项目中使用到了第三方的jar包,就需要把这些都放到libs目录下,

放到这个目录下的jar包都会被自动加载到构建路径里去.

3 android Test

用来编写Andorid Test测试用例的,可以对项目进行一些自动化测试

4 java

毫无疑问,java目录就是我们放置我们所有的Java代码的地方

5 res

这个目录内容有点多,简单说就是为你的资源文件分类

展开如下

图片放 drawable目录下

布局放 layout目录下

字符串放 values目录下

图标放 mipmap目录下

6 AndroidManifest.xml

这个是整个Android项目的配置文件,你在程序中定义的四大组件都需要在这个文件里注册,

另外还可以在这文件中给应用程序添加权限声明(后期再详细讲解--暂未学习)

7 test

用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式

8 .gitinore

用于将app模块内的指定目录或文件排除再版本的控制之外,作用和外层的.gitinore文件类似

9 app.iml

IntelliJ IDEA 项目自动生成的文件

10 build.gradle

这个是app模块的gradle构建脚本,这个文件会指定很多项目构建相关的配置(后面详细讲解)

11 proguard-rules.pro

这个文件用于指定项目代码的混淆规则,当代码打包成安装包文件,如果不希望被别人破解,通常会将代码进行混淆,从而让破解者难以阅读

----------------------------------项目结构了解完毕-----------------------------------------

探究Hello World 到底是怎么运行起来的吧

首先打开AndroidManifest.xml这个文件找到以下代码

1 //这一段代码表示对MainActivity这个活动进行注册
2         <activity android:name=".MainActivity" >
3 <intent-filter> 4 <action android:name="android.intent.action.MAIN" />//这个项目的主活动 5 <category android:name="android.intent.category.LAUNCHER" />//这个项目的主活动 6 </intent-filter> 7 </activity>

那么 MainActivity 具体作用,打开 MainActivity 代码如下

1 //Activity系统提供的活动基类,AppCompatActivity是Activity的子类
2 class MainActivity : AppCompatActivity() {
3     override fun onCreate(savedInstanceState: Bundle?) {
4         super.onCreate(savedInstanceState)//活动创建是必须要执行的方法
5         setContentView(R.layout.activity_main)//引入一个布局定义在res/layout目录下
6     }
7 }

Hello World 在哪里呢?

Android讲究逻辑和视图分离,可以看到

在onCreate()方法的第二行(第5行)调用了setContentView()方法,就是这个方法给当前的活动引入了一个 R.layout.activity_main 布局,那么Hello World 就这这个里面啦

布局文件是在res/layout 目录下(或者选中[activity_main]再Ctrl+鼠标左键,直接跳转到并打开这个文件),找到名叫activity_main.xml的,切换视图到Text视图就能看到了

如图所示

代码如下

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:background="#00C42D2D"
 8     tools:context=".MainActivity">
 9 
10     <TextView
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content"
13         android:background="#00FF0000"
14         android:text="Hello World" 
15         app:layout_constraintBottom_toBottomOf="parent"
16         app:layout_constraintLeft_toLeftOf="parent"
17         app:layout_constraintRight_toRightOf="parent"
18         app:layout_constraintTop_toTopOf="parent" />
19 
20 </androidx.constraintlayout.widget.ConstraintLayout>
21 <!--通过android:text 来定义要显示的文字-->

只需要自知道TextView这个控件,能够在布局中显示文字就行了

 -----------------现在就清楚了Hello World 是怎么显示在页面上的啦---------------------

前面已经介绍过res目录下每个文件夹的含义,打开res/values/string.xml 文件 代码如下所示

 1 <resources>
 2     <string name="app_name">Hello World</string>
 3 </resources>
 4 <!--定义了一个个应用程序名的字符串
 5 在代码中R.string.hello_world_application可以获得该字符串的引用
 6 在XML中通过@string/hello_world_application可以获得该字符串的引用
 7 其中string部分可以替换,
 8 如果引用的是图片资源就可以替换成drawable
 9 如果引用的是图标就可以替换成mipmap
10 引用的是布局则改成layout,以此类推
11 -->

举个例子,打开AndroidManifest.xml 文件,如下所示

 1 <application
 2         android:allowBackup="true"
 3         android:icon="@mipmap/ic_launcher"
 4         android:label="@string/app_name"
 5         android:roundIcon="@mipmap/ic_logo"
 6         android:supportsRtl="true"
 7         android:theme="@style/AppTheme" >
 8         ......
 9     </application>
10 <!--android:icon="@mipmap/ic_launcher" 指定图标
11     android:label="@string/app_name" 指定应用程序名称
12 -->

可以看到,这个是XML中引用资源的语法

我已经对程序的程序名和图标都做了更改啦,你也去试一试吧!

详细讲解build.gradle文件

最外层,代码如下所示

 1 buildscript {
 2     ext.kotlin_version = '1.3.50'
 3     repositories {//repositories闭包
 4         google()
 5         jcenter()//代码托管仓库
 6         
 7     }
 8     dependencies {
 9         classpath 'com.android.tools.build:gradle:3.5.2'//声明了个Gradle插件gradle:3.5.2 版本号
10         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11         // NOTE: Do not place your application dependencies here; they belong
12         // in the individual module build.gradle files
13     }
14 }
15 
16 allprojects {
17     repositories {
18         google()
19         jcenter()
20         
21     }
22 }
23 
24 task clean(type: Delete) {
25     delete rootProject.buildDir
26 }

第二个就是app目录下的啦,代码如下(有点复杂)

 1 apply plugin: 'com.android.application'//应用了一个插件,表示应用程序模块(可直接运行),
 2 // com.android.library表示库模块(只能作为代码库,依附别的应用程序模块来运行)
 3 
 4 apply plugin: 'kotlin-android'
 5 
 6 apply plugin: 'kotlin-android-extensions'
 7 
 8 //安卓闭包
 9 android {
10     compileSdkVersion 30 //用于指定项目的编译版本SDK
11     buildToolsVersion "30.0.2"//指定项目构建工具的版本
12     //嵌套了一个defaultConfig闭包
13     defaultConfig {
14         applicationId "com.ChenXianZi" //指定项目的包名
15         minSdkVersion 15 //最低兼容的Android系统版本
16         targetSdkVersion 30
17         versionCode 1 //指定项目的版本号
18         versionName "1.0" //指定项目的版本名
19         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
20     }
21     //buildTypes闭包
22     buildTypes {
23         release {
24             minifyEnabled false //是否对项目代码进行混淆 false是不混淆 true是混淆
25             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
26             //proguard-android-optimize.txt是在AndroidSDK目录下的里面是所有项目的通用的混淆规则
27             //proguard-rules.pro 是在当前项目的根目录下,里面可以编写当前项目特有的混淆规则
28         }
29     }
30 }
31 //dependencies闭包
32 dependencies {
33     //依赖包括本地依赖,库依赖,远程依赖
34     implementation fileTree(dir: 'libs', include: ['*.jar'])//本地依赖的声明
35     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
36     implementation 'androidx.appcompat:appcompat:1.0.2'
37     implementation 'androidx.core:core-ktx:1.0.2'
38     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
39     testImplementation 'junit:junit:4.12'//声明测试用例库,暂时用不到
40     androidTestImplementation 'androidx.test.ext:junit:1.1.0'
41     androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
42 }

这里面没有库依赖:

它的基本格式是compile project 后面加要依赖的库名即可

例如:库名叫test,那么添加库的依赖关系只需要加入compile project(':test')这句声明即可

----------------------------------------使用Android的日志工具---------------------------------

Android 中的日志工具类是Log(android.util.Log)

五个方法,如下所示

Log.v()

用于打印那些最为琐碎的、意义最小的日志信息.对应级别verbose,

是Android日志里面级别最低的一种.

Log.d()

用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的.

对应级别debug,比verbose高一级。

Log.i()

用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分析用户行为数据。

对应级别info,比debug高一级。

Log.w()

用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修

复一下这些出现警告的地方。对应级别warn, 比info高一级。

Log.e()

用于打印程序中的错误信息,比如程序进入到了catch 语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。

对应级别error,比warn高一级。

使用实例,代码如下:

 1 class MainActivity : AppCompatActivity() {
 2 
 3     override fun onCreate(savedInstanceState: Bundle?) {
 4         super.onCreate(savedInstanceState)//活动创建是必须要执行的方法
 5         setContentView(R.layout.activity_main)//引入一个布局定义在res/layout目录下
 6         Log.d("MainActivity","这是我写的第一行代码!")
 7         //第一个参数是tag一般是当前类名,第二参数是msg想打印的具体内容
 8         //不建议使用System.out.println();来输出日志信息
 9         //快捷键logd再按下tab键
10     }
11 }

运行的快捷键是Shift+F10(Mac系统是control+R)

 其中能看到的信息有打印日志的内容和tag名,程序的包名,打印的时间以及程序的进程号都可以看到

最后经过以上的学习,写出了我的第一行的代码

对明天的学习满怀期待!今天就写道这吧,继续加油!

posted @ 2020-09-20 16:58  无光我便是光明  阅读(162)  评论(0编辑  收藏  举报