一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露的。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URL来表示外界需要访问的“数据库”。

 跨进程通讯经典 App, Mms , Dialer  ,Contact,

     比如短信,通过providers里面的App进行数据增删改查  

     查询短信数据,拼装Uri通过AMS进行数据匹配找到相应的Provider进行数据共享

   

Cursor c = SqliteWrapper.query(mContext, mContentResolver,
Uri.parse("content://mms/" + msgId + "/part"),
PART_PROJECTION, null, null, null);

 

    AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。

  1.   ActivityManagerService  extends  ActivityManagerNative  implements  Watchdog.Monitor,           BatteryStatsImpl.BatteryCallback
  2. 客户端使用ActivityManager类。由于AMS是系统核心服务,很多API不能开放供客户端使用,所以设计者没有让ActivityManager直接加入AMS家族。在ActivityManager类内部通过调用AMN的getDefault函数得到一个ActivityManagerProxy对象,通过它可与AMS通信

 

下面直接看代码

这个dome是写两个APK进行跨进程。第一个APK进行数据填充

 1 . 我们首先创建一个简单数据库:

public class DbOpenHepen extends SQLiteOpenHelper {
public DbOpenHepen(Context context) {
super(context, "jereh.db", null, 4);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person(personid integer primary key " +
" autoincrement,name varchar(20),phone varchar(12))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL("drop table person");
onCreate(db);
}
}

 

2. 创建数据库帮助类

public class SQLiteHepen {
private Context context;
private DbOpenHepen helper = null;
public SQLiteHepen(Context context){
helper = new DbOpenHepen(context);
}

public void save(Person person){//增
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into person(name,phone) values(?,?)",new Object[]{person.getName(),person.getPhone()});
db.close();
}
public void delete(int personid){//删
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from person where personid=?", new Integer[]{personid});
db.close();
}
public void update(Person person){//改
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update person set name=?,phone=? where personid=?", new Object[]{person.getName(),person.getPhone(),person.getPersonid()});
db.close();
}
public Person find(int personid){//查
SQLiteDatabase db = helper.getReadableDatabase();
//Cursor cursor = db.rawQuery("select * from person where personid=?", new String[]{personid+""});
Cursor cursor=db.rawQuery("select * from person",null);
if(cursor.moveToFirst()){
int id = cursor.getInt(cursor.getColumnIndex("personid"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
return new Person( name, phone,personid);
}
cursor.close();
return null;
}
}

 

Person类

package com.android.contentprovaer;

public class Person {
private String name;
private String phone;
private int personid;

public Person(String name, String phone, int personid) {
this.name = name;
this.phone = phone;
this.personid = personid;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public int getPersonid() {
return personid;
}

public void setPersonid(int personid) {
this.personid = personid;
}
}

 

数据库创建完成

 

3.创建ContentProvider子类

public class PersonProvider extends ContentProvider {
private DbOpenHepen openHelper;
private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final int PERSONS = 1;
private static final int PERSON = 2;
@Override
public boolean onCreate() {
openHelper = new DbOpenHepen(this.getContext());
return false;
}
static{
MATCHER.addURI("com.android.contentprovaer.open", "person", PERSONS);
//* 根据pesonid来删除记录
MATCHER.addURI("com.android.contentprovaer.open", "person/#", PERSON);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase sqLiteDatabase = openHelper.getReadableDatabase();
switch (MATCHER.match(uri)) {
case 1:
return sqLiteDatabase.query("person", projection, selection, selectionArgs, null, null, sortOrder);
case 2:
long rowid = ContentUris.parseId(uri);
String where = "personid="+rowid;
if(selection != null && "".equals(selection.trim())){
where = selection+"and"+where;
}
return sqLiteDatabase.query("person", projection, where, selectionArgs, null, null, sortOrder);
}
return null;
}


@Override
public String getType(Uri uri) {
switch (MATCHER.match(uri)) {
case 1:
return "vnd.android.cursor.dir/person";
case 2:
return "vnd.android.cursor.item/person";
}
return null;
}

@Override
public Uri insert( Uri uri, ContentValues values) {
Log.v("liwangjiangCCC","value = "+values);
SQLiteDatabase sqLiteDatabase = openHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
long rowid = sqLiteDatabase.insert("person", "name", values);
return ContentUris.withAppendedId(uri, rowid);

default:
break;
}
return null;
}

@Override
public int delete(Uri uri,String selection,String[] selectionArgs) {
SQLiteDatabase sqLiteDatabase = openHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
return sqLiteDatabase.delete("person", selection, selectionArgs);
case 2:
long rowid = ContentUris.parseId(uri);
String where = "personid="+rowid;
if(selection != null && "".equals(selection.trim())){
where = selection+"and"+where;
}
return sqLiteDatabase.delete("person", where, selectionArgs);
}
return 0;
}

@Override
public int update(Uri uri, ContentValues values,String selection,String[] selectionArgs) {
SQLiteDatabase sqLiteDatabase = openHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
return sqLiteDatabase.update("person", values, selection, selectionArgs);
case 2:
long rowid = ContentUris.parseId(uri);
String where = "personid="+rowid;
if(selection != null && "".equals(selection.trim())){
where = selection+"and"+where;
}
return sqLiteDatabase.update("person", values, where, selectionArgs);
}
return 0;
}
}

 

4 . 注册ContentProvider类

<provider
android:authorities="com.android.contentprovaer.open" //暴露给外部的URI
android:exported="true" //第三方APP如果想访问就要开启权限
android:name=".PersonProvider"></provider>

 

创建三方APK

 

package com.android.contentprovider2;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view){
Uri uri = Uri.parse("content://com.android.contentprovaer.open/person");//进行数据匹配
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "xiaoli");
values.put("phone", "333333");
resolver.insert(uri, values);
}
}

Android ContentProvider(Android内容提供者,跨进程通讯)_ide