上篇文章总结了BroadcastReceiver,这篇文章来复习下四大组件的最后一个ContentProvider,ContentProvider能将应用程序内部存储的数据经过其所提供的访问方式分享给其它应用程序使用,让咱们先来看看系统提供的ContentProviderandroid
系统提供了各式各样的ContentProvider,好比通信录、短信等等,这里咱们以获取通信录中联系人信息为例bash
data class Contact(val id: Int, val name: String, val phone: String)
private fun getContacts(): List<Contact> {
val cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null)
val contacts = ArrayList<Contact>()
if (cursor != null) {
while (cursor.moveToNext()) {
val id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID))
val name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
// 再根据ID查出电话
val phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null)
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
val phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER))
contacts.add(Contact(id, name, phoneNumber))
}
phoneCursor.close()
}
}
cursor.close()
}
return contacts
}
// 所需权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
复制代码
这里先经过contentResolver.query查询出id和name,而后再根据id去另外一张表中查询phoneNumberide
咱们须要建立一个ContentProvider的子类,重写如下几个方法ui
而后再在清单文件中进行配置spa
<provider
android:authorities="com.hfw.provider"
android:exported="true"
android:name=".MyProvider"/>
复制代码
这里的主机名肯定了什么Uri可以调用该ContentProvider,好比这里设置了com.hfw.provider,那么只有以content://com.hfw.provider开头的Uri才会调用该ContentProvider,主机名后面还能够跟上要操做的代表、或者某些条件(本身约定好就行)线程