<span style="font-size:18px;"> </span>
应用程序之间唯一共享数据的方法
ContentProvider:负责组织数据,并把数据暴露出去
暴露数据就像是暴露了一个数据库,外界访问其中的数据类似于访问数据库表的数据。
只是用URI来表示访问外界的“数据库”,有android底层实现URI与哪个数据库对应。我们只需要知道访问特定数据的URI即可。
ContentProvider向外界提供数据操作的接口:
query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])
可能会有多个程序同时通过ContentResolver访问一个ContentProvider,可能导致像数据库那样的“脏数据”。
因此,,在AndroidManifest.XML中定义ContentProvider的时候,需要考虑是<provider>元素multiprocess属性的值;另外一方面Android在ContentResolver中提供了notifyChange()接口,在数据改变时会通知其他ContentObserver,这个地方应该使用了观察者模式,在ContentResolver中应该有一些类似register,unregister的接口。
ContentResolver:获取ContentProvider暴露的数据,对数据进行操作
查询Content Provider的方法有两个:ContentResolver的query() 和 Activity 对象的 managedQuery(),二者接收的参数均相同,返回的都是Cursor 对象,唯一不同的是 使用managedQuery 方法可以让Activity
来管理 Cursor 的生命周期。
被管理的Cursor 会在 Activity进入暂停状态的时候调用自己的 deactivate 方法自行卸载,而在Activity回到运行状态时会调用自己的requery 方法重新查询生成的Cursor对象。如果一个未被管理的Cursor对象想被Activity管理,可以调用Activity的 startManagingCursor方法来实现。
ContentResolver resolver=context.getContentResolver();
Cursor cursor=resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);