安卓 ContentProvider 详解

构建 content URI
1 | public class TaskContract { |

构建 URiMatcher
- 为多行和单行数据定义final整型常量
- 为完整的UriMatcher声明静态全局变量
- 定义一个将URI与整型匹配项关联的buildUriMatcher方法
1 | // Verify that TaskContentProvider extends from ContentProvider and implements required methods |
数据库解析流程

insert
1 | // Implement insert to handle requests to insert a single new row of data |
query
以下是查询一个任务的代码:
1 | // Implement query to handle requests for data by URI |
update
1 | // Update won't be used in the final ToDoList app but is implemented here for completeness |
delete
1 | // Implement delete to delete a single row of data |
getType
以下是 ToDo list 应用的 getType 示例:
1 | /* getType() handles requests for the MIME type of data |
安卓-sqlite 数据库
- 创建 Entry 的内部类, 该类实现 BaseColumns
- tableName 定义常量字符串
- 为 table 的每一项什么常量字符串
1 | package com.example.android.waitlist.data; |
安卓-偏好设置
设置可接受的范围
要将可接受的值限制在 0(不包括)和 3(包括)之间,我们选择使用 PreferenceChangeListener - 它与 SharedPreferenceChangeListener 的不同之处为:
- SharedPreferenceChangeListener 在任何值保存到 SharedPreferences 文件后被触发。
- PreferenceChangeListener 在值保存到 SharedPreferences 文件前被触发。因此,可以防止对偏好设置做出无效的更新。PreferenceChangeListeners 也附加到了单个偏好设置上。
流程通常如下所示:
- 用户更新偏好设置。
- 该偏好设置触发了 PreferenceChangeListener。
- 新的值保存到了 SharedPreference 文件。
- onSharedPreferenceChanged 监听器被触发。
除此之外,它们的行为很相似。你将在你的 Activity中实现Preference.OnPreferenceChangeListener,覆盖onPreferenceChange(Preference preference, Object newValue)。 onPreferenceChange 方法将返回 true 或 false,取决于偏好设置实际上是否要被保存。
若要妥善管理 Activity 生命周期,我们建议您在 onResume() 和 onPause() 回调期间分别注册和注销SharedPreferences.OnSharedPreferenceChangeListener。
安卓-Activity 详解
常见容器视图示例:
| 类名称 | description |
|---|---|
| LinearLayout | 在一行或一列里显示视图。 |
| RelativeLayout | 相对某个视图放置其他视图。 |
| FrameLayout | ViewGroup 包含一个子视图。 |
| ScrollView | 一种 FrameLayout,旨在让用户能够在视图中滚动查看内容。 |
| ConstraintLayout | 这是更新的 viewgroup;可以灵活地放置视图。在这节课的稍后阶段,我们将学习 ConstraintLayout。 |
Activity 会创建视图来向用户显示信息,并使用户与 Activity 互动。视图是 Android UI 框架中的类。它们占据了屏幕上的方形区域,负责绘制并处理事件。Activity 通过读取 XML 布局文件确定要创建哪些视图(并放在何处)。这些 XML 文件存储在标记为 layouts 的 res 文件夹内。
- onCreate 的 super 方法放在第一句, onPause 以后的 super 的方法放在最后一句.
onCreate
onStart
onResume
onPaush
onStop
onDestroy
1 | package com.example.android.lifecycle; |
Intent 匹配
Data 本身又分为两种方式进行匹配:MIMEType 和 URI。
MIMEType 就是指要访问的组件处理的数据类型,例如 video/mpeg4、video/mp4、video/avi 等。
MIMEType 也可以用通配符()匹配某一类型的数据,例如“audio/”表示所有的音频数据格式.
URI 有些类似我们经常使用的Web地址,但要比Web地址范围更广,例如,下面的3行字符串都属于 URI。
http: //www.google.com
content: //mobile.android.data/cities
ftp: //192.168.17.168
总结
定位窗口:
- 通过Componentname、Action、Category 和 Data 可以定位一个或多个窗口。
- 传递数据:通过 Data 和 Extra。
- 控制访问组件的行为(窗口、服务和广播):通过Flags。
注意显示调用过程中action为null, 这可作为判断是否显式调用/隐式调用的条件.
从常理推测<category>标签应该是可选的,不过实际上<category>也是必须加的,原因就是一个特殊的Category:android.intent.category.DEFAULT。如果调用者不添加Category,按常理会认为过滤条件中不包含Category,系统自然也就不考虑Category了。不过Android系统并不是这样认为的。不管调用者是否添加Category,系统都会认为有一个默认的Category已经被添加。相当于调用者执行如下的代码。intent.addCategory(Intent.CATEGORY_DEFAULT);
既然调用者默认加入了一个Category,那么被调用这自然也需要在过滤器(<intent-filter>标签)中加入如下的<category>标签了。
常用 Intent.FLAG
如果同时设置了 launchMode 和标志动作,则标志动作优先于相应的launchMode 属性值.
- singgletop: FLAG_ACTIVITY_SINGLE_ TOP
- singletask: FLAG_ACTIVITY_SINGLE_TOP + FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_CLEAR_TASK
如果在调用 Context.startActivity 时传递这个标记,将会导致任何用来放置该 activity 的已经存在的 task 里面的已经存在的 activity 先清空,然后该 activity 再在该 task 中启动,也就是说,这个新启动的 activity 变为了这个空 tas 的根 activity.所有老的 activity 都结束掉。该标志必须和 FLAG_ACTIVITY_NEW_TASK 一起使用。