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

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

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

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

     查询短信数据,拼装Uri通过AMS (AMS,翻译ActivityManagerSystem,)进行数据匹配找到相应的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);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35427437/article/details/90257811