20172327 2018-2019-1 《第一行代码Android》第一章学习总结

学号 2018-2019-1 《第一行代码Android》第一章学习总结

教材学习内容总结

- Android系统架构:

1.Linux内核层

Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动,音频驱动,照相机驱动,蓝牙驱动,Wi-Fi驱动,电源管理等。

2.系统运行底层

- 通过一些C/C++库来为Android系统提供了主要的特性支持

库名 功能
SQLite库 提供数据库的支持
OpenGL/ES库 提供3D绘图支持
Webkit库 提供了浏览器内核的支持

- Android运行时库(主要提供一些核心库,允许开发者使用Java语言来编写Android应用。)

Dalvik虚拟机(5.0系统后改为ART运行环境) 使每个Android应用都能运行在独立进程当中,并拥有一个自己的Dalvik虚拟机实例。


3.应用框架层


主要提供了构建应用程序时可能用到的各种API,Android自带的核心应用就是使用这些API完成的,开发者也可以用这些API来构建自己的应用程序。


4.应用层


应用程序都是属于这一层,联系人,短信,游戏等都是。

20172327 2018-2019-1 《第一行代码Android》第一章学习总结

总结:

  • 1 Android的系统架构采用分层架构的思想,架构清晰,层次分明,协同工作。
  • 2 Android的系统架构不仅从宏观上认识了Android系统,同时,也给我们的学习与实践指明了方向。若是从事Android应用开发,那应该研究Android的应用框架层和应用程序层;若是从事Android系统开发,那应该研究Android的系统库和Android运行时;若是从事Android驱动开发,那应该研究Android的Linux内核。总之,找准切入点,实践出真知。
- Android应用开发特色:

1.四大组件

  • 活动(Activity)

    Android应用程序的门面,凡是你在应用中看到得东西,都是放在活动中。
  • 服务(service)

    无法看到,在后台默默运行,退出应用后,服务仍然是可以继续运行的。
  • 广播接收器(Broadcast Receiver)

    允许你的应用接收来自各处的广播消息,如电话,短信等。
  • 内容提供器(Content Provider)

    程序之间共享数据。

2.丰富的系统控件

  • Android为开发者提供了丰富的系统控件,可以使我们轻松的编写出漂亮的界面。你也可以定制自己的控件。

3.SQLite数据库

  • 轻量级,运行速度快,嵌入式,关系型数据库。支持SQL语法,还可通过Android封装好的API进行操作,让储存和读取数据更方便。

4.强大的多媒体

  • 音乐,视频,录音,拍照,闹钟等,均可通过代码控制。

5.地理位置定位

  • 地理位置定位应该是一个亮点,Android手机内置GPS,所以走到哪都可以定位到自己的位置,发挥出创意十足的应用,结合地图功能,LBS (通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标),在地理信息系统(外语缩写:GIS、外语全称:Geographic Information System)平台的支持下,为用户提供相应服务的一种增值业务。)这一领域潜力无限。
- 开发环境构建工具:

1.JDK
- JDK是Java语言的软件开发工具包,它包含了Java的运行环境,工具合集,基础类库等内容。

2.Android SDK

  • Android SDk 是谷歌提供的Android开发工具包,在开发Android程序时,我们需要通过引入该工具包,来使用Android相关的API。

3.Android Studio

  • 2013年谷歌推出的一款官方的IDE工具,不在以插件形式存在,Android Studio在开发Android程序方面远比以前用的Eclipse强大和方便的多。
- 分析Android程序:

创建完毕以后,将项目结构模式切换成Project

1.整体目录结构分析
![](https://images2018.cnblogs.com/blog/1333119/201807/1333119-20180718092500667-1221908708.png)

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

说明:除了APP目录外,其他目录都是自动生成的。APP目录的下的内容才是我们的工作重点。


2.APP目录结构分析

20172327 2018-2019-1 《第一行代码Android》第一章学习总结

说明:程序的默认运行效果就是不写一行代码,直接部署到模拟器上的运行效果。


3.定义主活动

        <activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
//这两句代码表示MainActivity是主活动,点击图标后首先运行此活动
</intent-filter>
</activity>

说明: 这段代码表示对MainActivity活动进行注册,没有在AndroidManifest.XML中注册的活动是不能使用的。


4.主活动分析

package com.example.zy.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) {
//活动被创建必须要调用下述的方法
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

说明:

1.我们之前说了应用程序中所有的可以看到的东西都是放到活动中的,所以首先必须要继承自活动。

  2.主活动的继承关系:

20172327 2018-2019-1 《第一行代码Android》第一章学习总结

  3.super.onCreate(savedInstanceState)就是调用父类的onCreate构造函数,时用来创建活动的,savedInstanceState是保存当前Activity的状态信息。


5.HelloWorld来自哪?

其实在Android程序的设计讲究逻辑和视图分类,因此是不推荐在活动中直接编写界面的,更加通用的方法是在布局文件中编写界面,然后在活动中引入进来。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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.zy.myapplication.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>

说明: 我们看到其中有一个TextView,这是Android的一个控件,用于在布局中显示文字的。


6.详解res目录

20172327 2018-2019-1 《第一行代码Android》第一章学习总结

说明:之所以有这么多的mipmap开头的文件夹,其实主要是为了让程序能够更好地兼容各种设备。

打开values目录下的strings.xml文件:

<resources>
<string name="app_name">My Application</string>
</resources>

这里定义了一个应用程序名的字符串,我们可以使用以下两种方式引用它:

  • 在代码中通过: ◇ R.string.app_name
  • 在XML文件通过: ◇ @string/app_name

7.详解build.gradle

在AS中,我们是通过Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于 XML的繁琐配置。


I.最外端的build.gradle

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
} allprojects {
repositories {
jcenter()
}
}

说明:

  • 两处repositories中都使用了jcenter(),jcenter是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter上,声明了这些配置,我们就可以在项目中轻松引用任何jcenter上的开源项目了。
  • dependencies 使用了classpath 声明了一个Cradle插件。

II.APP目录下的build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.2" defaultConfig {
applicationId "com.example.zy.myapplication"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes { //用于指定生成安装文件的相关配置,一般有release和deubug两项。
release {
minifyEnabled false //是否对代码进行混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //代码的混淆规则
}
}
} dependencies { //用于指定当前项目的所有依赖关系
compile fileTree(dir: 'libs', include: ['*.jar'])
//上着为本地依赖关系,将libs目录下*jar包添加到构建路径当中
testCompile 'junit:junit:4.12'
//声明测试用例库的
compile 'com.android.support:appcompat-v7:25.2.0'
//这是一个标准的远程依赖库格式,Gradle在构建项目时会检查是否有此库的缓存,如果没有则联网下载.添加依赖库声明:compile project(':helper'),将helper依赖关系加入.
}

说明:

  • 第一行引用了一个插件,com.android.application'是一个应用程序模块,可以直接运行,com.android.library是一种库模块,只能作为代码库依附于别的应用程序模块来运行。
  • 接下来是一个大的Android闭包,这个闭包可以配合项目构建的各种属性。

        compileSdkVersion 25 :指定使用Android6.0系统的SDK编译。

        buildToolsVersion :指定项目构建工具的版本。
  • 接下来是一个defaultConfig闭包,可以对项目的更多细节进行配置。

        applicationId :执行项目的包名

         minSdkVersion 15 项目最低兼容的Android系统版本

         targetSdkVersion 25 你在该秒版本上做过了充分的测试,系统会为你的应用程序启动一些最新的功能和特性。

         versionCode 1 项目版本号

         versionName "1.0" 项目的版本名
- 使用Android的日志工具Log

1.Android中的日志工具类是Log,这个类中提供了如下5个方法来供我们打印日志。

  • Log.v():用于打印哪些最为繁琐、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低的一种
  • Log.d():用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别debug,比verbose高一级
  • Log.i():用于打印一些比较重要的数据,这些数据应该是你非常想看到的,可以帮你分析用户行为数据。对应级别into,比debug高一级
  • Log.w():用于打印程序中的警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方,对应级别warn比into高一级
  • Log.e():用于打印程序中的错误信息,比如程序进入到catch语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现了严重的问题,必须尽快修复。对应级别error,比warn高一级
  • 一共就五个方法,但是每个方法还会有不同的重载。

2.在MainActivity中,在onCreate()中添加一行代码Log.d("MainActivity", "onCreate execute");,然后运行。通过打印信息可以看出,打印日志的内容、tag名等等都可以看到。

Log.d方法中传入了2个参数,第一个参数是tag,一般传入当前的类名就可以了,主要用于对打印信息进行过滤;第二个参数是msg,即具体打印的内容。

3.为什么使用Log而不是用System.out

  • 这个方法在Eclipse中可以通过输入saso然后按下代码键,这种方法就自动出来了。不过遗憾的是Android Studio中不支持这种输入方式了。并且,它有很多缺点:日志打印不可控制。打印时间无法确定,不能添加过滤器,日志没有级别区分。

4.log的快捷输入和过滤器设置

  • 快捷输入可以通过输入logi然后按下Tab自动生成,其他几类类似00
  • 过滤器目前只有3个。
  • Show only select application表示只显示当前选中程序的日志;Firebase是谷歌公司提供的一个分析工具,我们可以不用管它。
  • No Filters相当于没有过滤器,会把所有的日志显示出来
  • Android Studio可以添加自定义的过滤器。

教材学习中的问题和解决过程

代码调试中的问题和解决过程

代码托管

结对及互评

其他(感悟、思考等,可选)

学习进度条

参考资料

上一篇:【机器学习系列】EM算法第三讲:由Jensen Inequality推导EM算法


下一篇:【读书笔记】【深入理解ES6】#1-块级作用域绑定