赞
踩
ContentProvider
是Android中的一个组件,用于实现应用程序之间的数据共享。它提供了一种标准化的接口,允许应用程序访问和操作其他应用程序的数据。ContentProvider
可以提供对数据的增删改查操作,并支持跨进程的数据共享。
下面是使用ContentProvider
的一般步骤:
创建一个继承自ContentProvider
的子类,并实现必要的方法,如query()
、insert()
、update()
、delete()
等。
query()
方法用于查询数据,返回一个Cursor对象,其中包含查询结果。insert()
方法用于插入数据,返回一个表示新插入数据的URI。update()
方法用于更新数据,返回受影响的行数。delete()
方法用于删除数据,返回受影响的行数。这些方法的参数包括Uri
对象,用于标识要操作的数据,以及其他必要的参数,如查询条件、更新数据等。
class MyContentProvider : ContentProvider() { override fun query( uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String? ): Cursor? { // 处理查询操作 // ... return cursor } override fun insert(uri: Uri, values: ContentValues?): Uri? { // 处理插入操作 // ... return newUri } override fun update( uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>? ): Int { // 处理更新操作 // ... return affectedRows } override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int { // 处理删除操作 // ... return affectedRows } // 其他方法 // ... } }
在<application>
标签内部,添加一个<provider>
标签来注册ContentProvider。指定android:name
属性为ContentProvider子类的完整类名,并设置其他必要的属性,如android:authorities
用于标识ContentProvider的权限。
android:name
属性:指定ContentProvider子类的完整类名。android:authorities
属性:用于标识ContentProvider的权限,一般为包名加上一个唯一的标识符。android:exported
表示ContentProvider是否可以被其他应用程序访问。<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
// ...
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapp.provider"
// 其他属性
/>
</application>
</manifest>
定义URI用于标识ContentProvider的数据。URI由三部分组成:content://
作为前缀,authority
用于标识ContentProvider的权限,以及可选的路径。
content://
:URI的前缀,用于标识ContentProvider。authority
:ContentProvider的权限,与注册时指定的android:authorities
属性相同。可以通过Uri.parse()
方法将字符串转换为Uri对象,如:Uri uri = Uri.parse("content://com.example.myapp.provider/data");
。
object MyContract {
const val AUTHORITY = "com.example.myapp.provider"
val CONTENT_URI: Uri = Uri.parse("content://$AUTHORITY/data")
}
在其他应用程序中,可以使用ContentResolver
类来访问ContentProvider。通过调用ContentResolver
的方法,如query()
、insert()
、update()
、delete()
等,传入指定的URI和其他参数来操作数据。
val cursor: Cursor? = contentResolver.query(MyContract.CONTENT_URI, null, null, null, null)
// 处理查询结果
// ...
ContentObserver
是Android中的一个类,用于监听ContentProvider
的数据变化。当ContentProvider
中的数据发生变化时,ContentObserver
可以收到通知,并执行相应的操作。ContentObserver
可以用于实时更新UI、同步数据等场景。
1.创建ContentObserver子类:创建一个继承自ContentObserver
的子类,并重写onChange()
方法。onChange()
方法会在ContentProvider中的数据发生变化时被调用。
class MyContentObserver(handler: Handler) : ContentObserver(handler) {
override fun onChange(selfChange: Boolean) {
// 处理数据变化的操作
// ...
}
}
2.注册ContentObserver:通过调用ContentResolver
的registerContentObserver()
方法来注册ContentObserver。传入要监听的URI、是否监听子路径、ContentObserver对象以及可选的标志。
val contentResolver: ContentResolver = context.contentResolver
contentResolver.registerContentObserver(uri, notifyForDescendants, contentObserver)
uri
:要监听的URI,可以是整个ContentProvider的URI,也可以是指定的某个数据的URI。notifyForDescendants
:是否监听子路径,如果为true,则当指定的URI或其子路径发生变化时,ContentObserver会收到通知。contentObserver
:要注册的ContentObserver对象。ContentResolver
的unregisterContentObserver()
方法来取消注册。contentResolver.unregisterContentObserver(contentObserver)
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。