Android ContentProvider(Android内容提供者,跨进程通讯)
发布日期:2021-06-30 21:23:33 浏览次数:2 分类:技术文章

本文共 7901 字,大约阅读时间需要 26 分钟。

         一个程序可以通过实现一个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类

 

创建三方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);    }}

转载地址:https://liwangjiang.blog.csdn.net/article/details/90257811 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android(进程通信)AIDL
下一篇:Android Dialer模块联系人搜索

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年05月04日 14时43分12秒