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中非常重要。
- ActivityManagerService extends ActivityManagerNative implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback
- 客户端使用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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年05月04日 14时43分12秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Network Compression网络压缩(一)
2019-04-30
Python 之 histogram直方图
2019-04-30
Python 之 Scatter散点图
2019-04-30
Python实现决策树 Desision Tree & 可视化
2019-04-30
决策树 Decision tree
2019-04-30
nominal和ordinal & 数据处理中四种基本数据类型
2019-04-30
Grid SearchCV(网格搜索)& Python实现
2019-04-30
单目深度估计 monodepth2模型 代码
2019-04-30
位图索引Bitmap indexes
2019-04-30
YOLO算法(二)—— Yolov2 & yolo9000
2019-04-30
Python的__future__模块
2019-04-30
计算机视觉中的cost-volume的概念具体指什么(代价体积)
2019-04-30
启发函数heuristic 与 A*
2019-04-30
Image Pyramid(图像金字塔)
2019-04-30