目录:
一、内容提供者:
ContentProvider在android中的作用是对外共享数据,可以通过它将应用程序中的数据共享给其他应用使用,其他应用也可对数据进行操作。
要实现应用的数据共享,需要继承ContentProvider类:
1 package com.lewu.provider; 2 3 import android.content.ContentProvider; 4 import android.content.ContentValues; 5 import android.database.Cursor; 6 import android.net.Uri; 7 8 public class MyProvider extends ContentProvider{ 9 10 @Override 11 public boolean onCreate() { 12 return false; 13 } 14 15 @Override 16 public Cursor query(Uri uri, String[] projection, String selection, 17 String[] selectionArgs, String sortOrder) { 18 return null; 19 } 20 21 @Override 22 public String getType(Uri uri) { 23 return null; 24 } 25 26 @Override 27 public Uri insert(Uri uri, ContentValues values) { 28 return null; 29 } 30 31 @Override 32 public int delete(Uri uri, String selection, String[] selectionArgs) { 33 return 0; 34 } 35 36 @Override 37 public int update(Uri uri, ContentValues values, String selection, 38 String[] selectionArgs) { 39 return 0; 40 } 41 42 }
第二步:在AndroidMainfest.xml中加入以下配置信息:
1 <provider android:name=".MyProvider" android:authorities="com.lewu.provider.myprovider"></provider>
(1)URI介绍: 是访问其他应用的提供者的方式,相当于通过url去访问网页一样
content://com.lewu.provider.myprovider/person/10
content为schema
com.lewu.provider.myprovider:主机名或authority
/peron/10为路径
安卓中提供方法将字符串转换成URI Uri.parse("content://com.lewu.provider.myprovider/person/10")
第三步:完成MyProvider类共享数据
1 package com.lewu.provider; 2 3 import com.lewu.db.dao.PersonDao; 4 5 import android.content.ContentProvider; 6 import android.content.ContentValues; 7 import android.content.UriMatcher; 8 import android.database.Cursor; 9 import android.net.Uri; 10 11 public class MyProvider extends ContentProvider { 12 13 private static UriMatcher match = new UriMatcher(UriMatcher.NO_MATCH); 14 private static Uri baseUri = Uri.parse("content://com.lewu.provider.myprovider"); 15 private static final int ALL_PERSON = 1; 16 private PersonDao dao; 17 18 static { 19 match.addURI("com.lewu.provider.myprovider", "person", ALL_PERSON); 20 } 21 22 @Override 23 public boolean onCreate() { 24 dao = new PersonDao(getContext()); 25 return false; 26 } 27 28 @SuppressWarnings("unused") 29 @Override 30 public Cursor query(Uri uri, String[] projection, String selection, 31 String[] selectionArgs, String sortOrder) { 32 int type = match.match(uri); 33 switch (type) { 34 case ALL_PERSON: 35 if (selection != null && selectionArgs != null) { 36 return dao.queryAllPerson(selection, selectionArgs); 37 } else { 38 return dao.getCursor(); 39 } 40 } 41 defualt: 42 throw new IllegalArgumentException("不能识别的uri"); 43 } 44 45 @Override 46 public String getType(Uri uri) { 47 return null; 48 } 49 50 @Override 51 public Uri insert(Uri uri, ContentValues values) { 52 return null; 53 } 54 55 @Override 56 public int delete(Uri uri, String selection, String[] selectionArgs) { 57 return 0; 58 } 59 60 @Override 61 public int update(Uri uri, ContentValues values, String selection, 62 String[] selectionArgs) { 63 return 0; 64 } 65 66 }
通过UriMather类中addUril方法来配置访问指定数据的uri、
第四步:在其他应用通过uri访问内容提供者(通过ContentResover类中的方法来访问)
1 ContentResolver resolver = getContext().getContentResolver(); 2 3 Uri uri = Uri.parse("content://com.lewu.provider.myprovider/person"); 4 5 Cursor cursor = resolver.query(uri, null, null, null, null); 6 7 if (cursor.moveToFirst()) { 8 System.out.println("========"); 9 }
二、内容观察者
1、ContentProvider访问者需要知道ContentProvider是否发生改变时,可以在ContentProvider发生改变时调用getContentResolver().notifyChange(uri,null)来通知注册在此uri上的访问者
2、访问者要得到ContentProvider数据变化的通知,必须使用ContentObserver对数据进行监听,当监听到数据发生变化时,系统会调用ContentObserver中的onChange()方法
如下:
1 getContentResolver().registerContentObserver(Uri.parse("content://cn.itcast.providers.personprovider/person"), 2 true, new PersonObserver(new Handler())); 3 public class PersonObserver extends ContentObserver{ 4 public PersonObserver(Handler handler) { 5 super(handler); 6 } 7 public void onChange(boolean selfChange) { 8 //此处可以进行相应的业务处理 9 } 10 }
三、短信监听(内容观察者的案例)
android中存储短息和电话信息的数据库在com.android.providers.telephony目录下
对短信进行监听 需要找到访问者注册监听的uri路径,寻找ContentProvider中notify方法中的uri即可
短信监听者注册的uri路径为content://sms/
1 package com.lewu.sms; 2 3 import android.app.Activity; 4 import android.database.ContentObserver; 5 import android.database.Cursor; 6 import android.net.Uri; 7 import android.os.Bundle; 8 import android.os.Handler; 9 10 public class SmsobserverActivity extends Activity { 11 @Override 12 public void onCreate(Bundle savedInstanceState) { 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.main); 15 Uri uri = Uri.parse("content://sms/"); 16 getContentResolver().registerContentObserver(uri, true, 17 new MyObserver(new Handler())); 18 } 19 20 @SuppressWarnings("unused") 21 private class MyObserver extends ContentObserver { 22 23 public MyObserver(Handler handler) { 24 super(handler); 25 } 26 27 @Override 28 public void onChange(boolean selfChange) { 29 30 super.onChange(selfChange); 31 32 System.out.println("短信内容发生了变化"); 33 34 Cursor cursor = getContentResolver().query(Uri.parse("content://sms/"), null, null, null, "date desc"); 35 36 while (cursor.moveToNext()) { 37 String content = cursor 38 .getString(cursor.getColumnIndex("body")); 39 System.out.println(content); 40 41 } 42 } 43 44 } 45 }
四、利用内容提供者操作联系人数据库
联系人的数据库保存在com.addroid.provider.contacts目录下
查看表结构可分析有如下的关联
测试:
1 package com.lewu.contect; 2 3 import android.database.Cursor; 4 import android.net.Uri; 5 import android.test.AndroidTestCase; 6 7 public class ContectTest extends AndroidTestCase { 8 9 public void queryContect() { 10 11 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); 12 13 Cursor cursor = getContext().getContentResolver().query(uri, null, 14 null, null, null); 15 16 while (cursor.moveToNext()) { 17 18 String id = cursor.getString(cursor.getColumnIndex("_id")); 19 String name = cursor.getString(cursor 20 .getColumnIndex("display_name")); 21 22 System.out.println(name); 23 24 Uri dataUri = Uri.parse("content://com.android.contacts/data"); 25 26 Cursor dataCursor = getContext().getContentResolver().query( 27 dataUri, null, "raw_contact_id=?", new String[] { id }, 28 null); 29 30 while (dataCursor.moveToNext()) { 31 if ("vnd.android.cursor.item/phone_v2".equals(dataCursor 32 .getString(dataCursor.getColumnIndex("mimetype")))) { 33 System.out.println("电话" 34 + dataCursor.getString(dataCursor 35 .getColumnIndex("data1"))); 36 } else if ("vnd.android.cursor.item/email_v2".equals(dataCursor 37 .getString(dataCursor.getColumnIndex("mimetype")))) { 38 System.out.println("邮箱" 39 + dataCursor.getString(dataCursor 40 .getColumnIndex("data1"))); 41 } 42 } 43 dataCursor.close(); 44 } 45 cursor.close(); 46 } 47 48 }