上篇文章總結了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,主機名後面還能夠跟上要操做的代表、或者某些條件(本身約定好就行)線程