《第一行代码 ANDROID》学习笔记 ( 只记录碎片知识 )
第一章
1、第一个 HelloWorld 程序解析
位于/app/java/HelloWorldActivity
public class HelloWorldActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout,hello_world_layout);
}
}
① HelloWorldActivity 继承自 AppCompatActivity (Activity的子类);Activity 是 Android 系统提供的一个活动基类,项目中所有的活动都必须继承它或者它的子类才能拥有活动的特性。
② onCreate() 方法是一个活动被创建时必定要执行的方法,经常在这个方法中做一些初始化操作,如成员变量的初始化等;该方法在activity的生命周期中只调用一次,但是有一个例外就是切换横竖屏时。
③ setContentView() 方法给当前的活动引入了一个hello_world_layout布局。
位于 AndroidManifest.xml 文件
<activity android:name=".HelloWorldActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
① 这段代码表示对 HelloWorldActivity 活动进行注册,没有在 AndroidMainfest.xml 里注册的活动是不能使用的。
② intent-filter 里面的两行代码表示 HelloWorldActivity 是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。
布局文件位于res/layout目录下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://shemas.android.com/tools"
android:id="@+id/hello_world_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.helloworld.HelloWorldActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<RelativeLayout>
① TextView 是Android系统提供的一个控件,用于在布局中显示文字。
总结:Android程序的设计讲究逻辑和视图分离,并且活动需要在AndroidMainifest中进行注册。
2、res目录下资源的引用
<resources>
<string name="app_name">HelloWorld</string>
</resource>
① 在代码中通过 R.string.app_name 可以获得该字符串的引用
② 在XML中通过 @string/app_name 可以获得该字符串的引用
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher" // 应用图标
android:label="@string/app_name" // 应用名称
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
</application>
3、解析 build.gradle 文件
// 全局 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
}
}
allprojexts {
repositories {
jcenter()
}
}
① 两处repositories的闭包中都声明了 jcenter() 这行配置,jcenter是一个代码托管系统,很多Android开源项目都会选择将代码托管到 jcenter 上,声明了这行配置之后,就可以在项目中轻松引用任何 jcenter 上的开源项目。
② dependencies 闭包中使用classpath声明了一个Gradle插件。因为Gradle插件不是专门为构建Android项目而开发的,所以需要声明com.android.build:gradle:2.2.0这个插件,2.2.0代表插件的版本号。
③ 通常不需要更改,除非想添加一些全局的项目构建配置。
位于 /app/build.gradle
apply plygin: 'com.android.application' // 应用了一个插件
android { // Android闭包可以用来配置项目构建的各种属性
compileSdkVersion 24 // 指定项目的编译版本
buildToolsVersion "24.0.2" // 指定项目构建工具的版本
defaultConfig { // 可以对项目的更多细节进行配置
applicationId "com.example.helloworld" // 指定项目的包名
minSdkVersion 15 // 指定项目最低兼容的Android系统版本
targetSdkVersion 24 // 表示在指定版本已做过测试,将自动引用相应版本的功能
versionCode 1 // 指定项目的版本号
versionName "1.0" // 指定项目的版本名
}
buildTypes { // buildTypes闭包用来指定生成安装文件的相关配置
debug { // 用来指定生成测试版本安装文件的配置
// 显示Log
signingConfig signingConfigs.config
buildConfigField "boolean", "LOG_DEBUG", "true"
//applicationIdSuffix ".debug"//包名加上debug
manifestPlaceholders = [APP_NAME: "@string/app_name_miliao"]
versionNameSuffix "-debug-v${gitVersionCode()}"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
}
release { // 用来生成正式版安装文件的相关配置
minifyEnable false // 指定是否的项目的代码进行混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro' // 用于指定混淆时使用的规则文件
// proguard-android.txt 是在 Android SDK目录下的,里面是所有项目通用的混淆规则
// proguard-rules.pro 是在当前项目的根目录的,里面可以编写当前目录特有的混淆规则
}
}
}
dependencies { // dependencies闭包可以指定当前项目的所有的依赖关系
// Android Studio 项目一共有3种依赖关系
// 本地依赖: 可以对本地的Jar包或目录添加依赖关系
// 库依赖: 可以对项目中的库模块添加依赖关系
// 远程依赖: 可以对jcenter库上的开源项目添加依赖关系
compile fileTree(dir: "libs", include: ['*.jar'])
// 本地依赖,表示将lib目录下所有.jar后缀的文件都添加到项目的构建路径之中
compile 'com.android.support:appcompat-v7:24.2.1'
// 远程依赖,com.android.support是域名部分,用于和其他公司的库做区分
// appcompat-v7是组名称,用于和同一公司中不同库做区分
// 24.2.1是版本号,用于和同一个库不同版本做区分
compile project(':helper')
// 库依赖,与helper库建立依赖
testCompile 'junit:junit:4.12' // 用于声明测试用例库
}
① 应用插件一般有两种值:com.android.application 应用程序模块 com.android.library 库模块
应用程序模块可以直接运行,库模块只能作为代码库依附于别的应用程序模块来运行。
② buildTypes闭包中的debug闭包可以忽略不写。
4、日志工具 Log
Android 中的日志工具类是 Log (android.util.Log)
Log.v() : 打印 最琐碎的、意义最小的日志信息。verbose 优先级最低
Log.d() : 打印 调试信息。debug 优先级比verbose高一级
Log.i() : 打印 一些比较重要的数据。info 优先级比debug高一级
Log.w() : 打印 警告信息。warn 优先级比info高一级
Log.e() : 打印 程序中的错误信息。error 优先级比warn高一级
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_world_layout);
Log.d(tag:"HelloWorldActivity",msg:"onCreate execute");
// tag 一般传入当前的类名就好,主要用来对打印信息进行过滤
// msg 即想要打印的具体的内容
}
打印信息
09/27 14:21:13.949 3253-3253/com.example.helloworld D/HelloWorldActivity: onCreate execute
打印时间 程序进程号 程序的包名 D代表是Log.d tag参数 msg参数
① System.out.println() 方法打印日志的缺陷:日志打印不可控、打印时间无法确定、不能添加过滤器、日子没有级别区分等
② Android Studio 也有快捷输入。输入logw,按下Tab键,会自动补全一条 warn 级别的打印日志。