书名 | 第一行代码:Android(第二版) |
---|---|
作者 | 郭霖 |
状态 | 已读完 |
简介 | Android + Java 开发 |
安卓系统架构
- 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, 对比可以参考下面文章。
内容提供器#
主要用于不同的应用程序之间实现数据共享功能。
例如电话簿程序共享联系人
权限#
运行时权限:软件使用过程中对某项权限进行授权
开发时
- 判断用户是否授权 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 设定实现实现