技术/笔记/《第一行代码:Android》读书笔记 (二)
为方便笔记,约定使用一下伪Kotlin语法:
<!ClassName>用来表示ClassName类的一个实例
<Abstract>或<A>写在方法(类)前用来表示该方法(类)是一个必须要给出实现的抽象方法
XXX表示待定的语法字符串
...表示前后代码段省略
第六章 全局大喇叭!详解广播机制
监听/接受广播
- 静态/动态注册BroadcastReciever,注意静态注册的接收器不能接受隐式Intent,还缺乏Activity上下文,但是能够在没启动的情况下收听到广播信号
- 静态注册:Manifest中注册;动态注册:Activity中注册,要记得自行销毁
发送自定义广播
- 
Intent可以不但可以穿梭于不同Activity之间,也可以穿梭于不同Application之间(Broadcast) 
- 
分类:标准广播(一传多),有序广播(one by one,可截断) 
第七章 数据存储:告别不持久
文件存储
适合存储一些简单的文本数据或二进制数据
- Context 类提供 openFileOutput(...), openFileInput(...)用来打开(创建)一个/data/data/<package name>/files/目录下的文件,方法返回一个FileOutPutStream或FileInputStream对象,该对象可使用 Java流 的方式IO
- 举例:FileOutPut - OutputStreamWriter - BufferedWriter
| 1 |  | 
SharedPreferences 存储
SharedPreferences 是使用键值对的方式来存储数据的,支持多种数据类型的存储
- 获取SharedPreferences:
- Context 的 getSharedPreferences()
- Activity 的 getPreferences()
 
- Context 的 
- 存储步骤
- 
调用SharedPreferences对象的edit()方法获取一个SharedPreferences.Editor对象。 
- 
向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putString()方法,以此类推。 
- 
调用apply()方法将添加的数据提交,从而完成数据存储操作。 
- KTX库方法:
| 1 |  | 
SQLite数据库存储
SQLite 是一种轻量简便的关系型数据库,可以用来存储复杂关系的数据
- SQLiteOpenHelper帮助类,借助这个类可以非常简单地对数据库进行创建和升级(需要重写onCreate(), onUpgrate())
- 两种CRUD方式:SQLiteDataBase类成员函数;SQL语句执行。
- KTX库:contentValuesOf() 方法
- 数据库文件存储路径:/data/data/<package name>/databases/下
创建数据库
- 继承一个SQLiteOpenHelper的帮助类
| 1 |  | 
可以使用AS的Device File Explore和Database Navigate插件浏览虚拟机中的文件和数据库
升级数据库
- 
改变 SQLiteOpenHelper类的version: Int参数,则下一次打开数据库的时候(用getReadableDatabase()getWritableDataBase())会调用onUpgrade()方法。
- 
最佳编写方式:针对不同版本编写不同逻辑 
| 1 |  | 
数据库のCRUD
- 直接执行 SQL 语句
| 1 |  | 
 
- 使用内置方法
| 1 |  | 
| query()方法参数 | 对应SQL部分 | 描 述 | 
|---|---|---|
| table | from table_name | 指定查询的表名 | 
| columns | select column1, column2 | 指定查询的列名 | 
| selection | where column = value | 指定where的约束条件 | 
| selectionArgs | - | 为where中的占位符提供具体的值 | 
| groupBy | group by column | 指定需要group by的列 | 
| having | having column = value | 对group by后的结果进一步约束 | 
| orderBy | order by column1, column2 | 指定查询结果的排序方式 | 
Cursor的更多用法
| 1 |  | 
SQLite 事务
- (约定db: SQLiteDataBase) 首先用db.Transaction()开启事务,之后在try块中编写数据库事务逻辑,结束时调用db.setTransactionSuccessful(),如果事务处理期间抛出异常将被catch捕获,事务将不被处理;如果顺利完成无Exception抛出,则在finally块中调用db.endTransaction()结束事务。
| 1 |  | 
第八章 跨程序共享数据,探究 ContentProvider
Android 权限机制
- 普通权限申请:在AndroidManifest.xml中注册即可
| 1 |  | 
- 运行时权限(危险权限)申请:第一步同普通权限,第二步如下
| 1 |  | 
Uri 类
- 
内容URI为每一个app的ContentProvider中的数据提供了一个唯一标识符 
- 
内容URI字符串由协议声明、authority 和 path 组成(通配符:井号匹配任意长度数字;星号匹配任意长度字符串) 
| 1 |  | 
| 1 |  | 
 
ContentResover 类
- 
获取实例:通过 <!Context>.getContentResolver()——Kotlin中即contentResolver属性
- 
ContentResolver 的 CURD (将SQLiteDataBase对应的CURD中表名换成Uri即可) 
ContentProvider 类
ContentProvider实例需要实现其他app访问本app的CURD接口,而ContentResolver只是提供了一个访问其他程序的api;二者CURD 函数参数列表相同。
- 
创建一个ContentProvider组件 - 使用AS的快捷方式
- 手动注册AndroidManifest.xml
 
- 
<ContentProvider>组件属性- exported:是否允许外部程序访问
- enabled:是否启用
 
- 
ContentProvider类中有6个抽象方法,我们在使用子类继承它的时候,需要将这6个方法全部重写。 
| 1 |  | 
- UriMatcher 类:方便匹配 ContentProvider 的 CURD 方法中的Uri(当调用UriMatcher的match()方法时,可以将一个Uri对象传入,返回值是某个能够匹配这个Uri对象所对应的自定义代码,利用这个代码,就可以判断出调用方期望访问的是哪张表中的数据了。)
| 1 |  | 
- 
MIME 字符串格式: - 
必须以vnd开头。 
- 
如果内容URI以路径结尾,则后接 android.cursor.dir/;如果内容URI以id结尾,则后接android.cursor.item/。
- 
最后接上 vnd.<authority>.<path>。
 
- 
| 1 |  | 

