【读书笔记】第一行代码：Android（第2版）

书名 | 第一行代码：Android（第二版）
作者 | 郭霖
状态 | 已读完
简介 | Android + Java 开发

第一行代码：Android（第 2 版）

安卓系统架构

Linux 内核层

系统运行库层

应用框架层

应用层

安卓四大组件：活动（Activity）、服务（Service）、广播（Broadcast Receiver）和内容提供器（Content Provider）。

项目结构

java 文件夹：项目代码

res 文件夹： 项目图片、布局、字符串等资源。

Drawable 文件夹：用于存放各种类型的图形资源，包括但不限于 PNG、JPEG、GIF 图片，XML 定义的可绘制资源（如形状、选择器等），以及九宫格图（9-patch）。这些资源可以被用来作为背景、图标、分割线等。

Mipmap 文件夹：主要用于存放应用启动器图标。使用 mipmap 文件夹有助于确保应用程序图标在不同分辨率和屏幕密度的设备上都能获得最佳显示效果。

Layout 文件夹：页面布局文件

build.gradle app 模块的 gradle 构建脚本

AndroidManifest.xml 项目的配置文件，四大组件都要在此注册。

活动

设置主活动: 在 activity 标签中加入 intent-filter 标签等声明。

** 添加菜单：** 构建 menu 资源文件并在活动中引用

Intent

通过使用 Intent 进行活动的跳转、启动服务、发送广播等。

显示 Intent： 显式的指出要启动的活，

启动活动时传参: putExtra -> getStringExtra 在。

返回数据给上个活动： startActivityForResult 启动新活动，使用 onActivityResult 接受新活动销毁时返回的参数

隐式 Intent： 通过在 activity 中设定当前活动响应的 action 和 category，也可以启动其他程序的活动（根据协议不同，支持网页、电话等并传递参数）。

每个 Intent 只能值得一个 action，但能指定多个 category。

生命周期

根据活动的可见性、是否位于栈顶，活动生命周期的四个状态：运行状态、暂停状态、停止状态、销毁状态。

OnSaveInstance: 活动被回收之前调用，可保留临时数据。

活动的启动模式： standard、singleTop、singleTask、singleInstance。

页面控件及布局

控件可见性： visible、invisible、gone

布局

线性布局 LinearLayout： 在线性方向（水平 horizontal，垂直 vertical）上依次排列

相对布局 RelativeLayout： 相对定位方式（相对父布局、相对页面）让控件出现在任何位置

帧布局 FrameLayout： 所有控件默认在左上角

百分比布局：PrecentFrameLayout 和 PercentRelativeLayout

自定义布局： 定义好后，通过 include 引入；

控件的继承结构

自定义控件： 创建自定义布局的逻辑进行复用，通过 inflate 动态加载布局文件

Fragment

可以嵌入在活动中的 UI 片段，每个碎片都有其对于的布局文件、代码文件。

一个活动中可以包括多个碎片，通过 FrameLayout 碎片的切换。

在碎片中获取活动实现，碎片与活动，碎片与碎片之间的通讯。

碎片的生命周期

动态加载布局

比如：根据设备类型（平板 、手机）使用不同的布局

使用限定符 对应不同的文件夹名 （可以利用限定符区分 大小、分辨率、方向）

广播机制

可以跨进程通信

标准广播： 异步，同时受到，无法被打断

有序广播：同步执行 同一时刻只有一个收到

广播类型

动态注册： 代码中注册，使用完成后需要及时关闭

静态注册： 在 AndroidManifest 中注册

对于系统的广播接收，部分需要声明权限。

发送广播

标准广播： 自定义 intent + sendBroadcast 方法

有序广播：自定义意图 + sendOrderedBroadcast 方法

本地广播

使用 LocalBroadCast 对广播进行广利，使用其对于的发送和接收方法。

数据持久化技术

Android 中的三种数据持久化方法

文件

SharedPreferences

数据库

文件

存储在应用目录下的 files 文件夹下

文件流写入 （openFileOutput、openFileInput）

SharedPreferences

使用键值对存储数据 数据存储在 包名 /shared_prefs/ 以 xml 形式存储

存储数据

获取 sharedPreferences 对象，使用 edit（）方法获取 Editor 对象

存取数据对象

使用 apply 方法保存

读取数据

使用 get 方法根据 键 获取对应的 值

SQLite

书中 提到使用 Android API 、 SQL 语句 以及 LitePal 方法进行数据库的操作，也可以使用 Greendao, 对比可以参考下面文章。

Android 中数据库框架 GreenDao 与 LitePal 对比、集成、使用详解，greendao 与原生 SQLite 性能对比_litepal 和 sqlite,greendao 哪个好 - CSDN 博客

内容提供器

主要用于不同的应用程序之间实现数据共享功能。

例如电话簿程序共享联系人

权限

运行时权限：软件使用过程中对某项权限进行授权

开发时

判断用户是否授权 checkSelfPermission

授权则继续运行，否则就申请授权 requestPermission

访问其他程序中的数据

通过 getContentResolver 获取实例

读取数据

创建内容提供器

创建类继承自 ContentProvider，重写下面方法

onCreate 初始化调用

query 查询，根据 uri 参数确定查哪张表

insert 插入

update 更新已有数据

delete 删除

getType 获取 uri 返回相应的 MIME 类型

手机多媒体

通知

获取通知实例 NotificationManager

创建通知对象，加入 Intent 执行通知点击操作

发送

摄像头，音视频

网络

使用 webView 显示网页

使用 http 访问 HttpURLConnection 、 OKHttp

通过 OKHttp 可以组件 GET POST 等请求

XML 解析：Pull 解析、SAX 解析

JSON 解析： JSONObject、GSON

服务

Android 中实现程序后台运行的解决方案

当应用程序进程被杀掉时，所有依赖于该进程的服务也会停止

Android 多线程编程

继承 Thread 类

实现 Runnable 接口

编写匿名类

子线程中更新 UI

Android 中不允许在子线程中更新 UI

通过异步消息处理机制，实现控件的更新。

异步消息处理的构成

Message： 线程之间传递的消息

Handler： 发送和处理消息

MessageQueue：消息队列，存放所有 Handler 的消息，每个线程中只有一个

Looper: 管理线程 中的消息队列

AsyncTask 使用

onProExecute 执行前调用

doInBackground 子线程中运行的

onProgressUpdate 响应后台中 publishProgress 是 更新 UI

onPostExecute 任务执行完毕后的操作

服务

定义后通过 Intent 启动或停止（startService、stopService）

服务实例只有一个，但每次调用 startService，onStartCommand 就会执行一次

** 前台服务：** 服务中加入通知 (通知栏展示) 并调用 startForeground

**IntendService：** 异步、自动停止

活动与服务的通信

构建 Binder 对象，在 Service 时使用 onBind 方法

活动中调用 Binder 方法

基于位置的服务

申请 API Key 并下载 SDK

权限声明

获取位置信息包括： 经纬度、地址、地图

Material Design

ToolBar

滑动菜单 第一个子控件显示主页面内容，第二个显彩蛋内容

NavigationView 可以自定义滑动菜单中顶部和菜单布局

FloatingActionButton 悬浮按钮

SnackBar 提示并增加可操作按钮

CoordinatorLayout 监听所有子控件的时间，自动做出合理响应

CardVuiew 卡片布局

SwipeRefreshLayout 下拉刷新

进阶开发

自定义 Application 类全局获取 Context

通过对象的 Serializable（序列化实现） 或 Parcelabel（讲完整对象分解） 接口实现，使 Intent 传递对象

自定义日志工具

创建定时任务：Alarm 设定实现实现