技术/笔记/《第一行代码: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 |
|