ContentPrivider实现IPC

    xiaoxiao2021-12-13  51

    1.内容提供者介绍

    ContentPrivider内容提供者是Android中提供的专门用于不同应用间进行数据共享的方式当我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。ContentPrivider可实现进程间通信,ContentPrivider的底层是Binder

    2.创建内容提供者

    package com.zhoujian.contentprivider.privider; import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.util.Log; import com.zhoujian.contentprivider.db.DbOpenHelper; /** Created by zhoujian on 2016/11/29. 实现为实现的方法选中BookPrivider————>option+enter----->选择未实现的方法 要在清单文件中配置 <provider android:name=".privider.BookPrivider" android:process="com.zhoujian.contentPrivider:privider" android:authorities="com.zhoujian.contentPrivider.bookprivider" android:permission="com.zhoujian.contentPrivider.permission"/> 其中android:authorities="com.zhoujian.contentPrivider.bookprivider"是唯一标识 通过这个属性外部应用就可以访问这个BookPrivider,因此authorities必须是唯一的, 外部应用就可以访问这个BookPrivider,也必须加上这个权限(如果要是两个应用,就必须加上权限) android:permission="com.zhoujian.contentPrivider.permission" */ public class BookPrivider extends ContentProvider { //快捷键:shift+command+u 大小写转换 private static final String TAG = "BookPrivider"; //访问的权限 public static final String AUTHORITIES = "com.zhoujian.contentPrivider.bookprivider"; //书籍表的uri public static final Uri BOOK_URI = Uri.parse("content://"+AUTHORITIES+"/book"); //用户表的uri public static final Uri USER_URI = Uri.parse("content://"+AUTHORITIES+"/user"); //创建Uri匹配器 private static final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //书籍表的uri code private static final int BOOK_URI_CODE = 0; //用户表的uri code private static final int USER_URI_CODE = 1; //静态代码块 static { mUriMatcher.addURI(AUTHORITIES,"book",BOOK_URI_CODE); mUriMatcher.addURI(AUTHORITIES,"user",USER_URI_CODE); } private Context mContext; private SQLiteDatabase mDatabase; private String table; public boolean onCreate() { //获取当前线程名 Log.d(TAG, "onCreate(),当前线程==="+Thread.currentThread().getName()); mContext = getContext(); initData(); return true; } private void initData() { DbOpenHelper db = new DbOpenHelper(mContext); mDatabase = db.getWritableDatabase(); mDatabase.execSQL("delete from book"); mDatabase.execSQL("delete from user"); mDatabase.execSQL("insert into book values(1,'操作系统课程');"); mDatabase.execSQL("insert into book values(2,'计算机网络');"); mDatabase.execSQL("insert into book values(3,'计算机系统结构');"); mDatabase.execSQL("insert into user values(1,'周建',0);"); mDatabase.execSQL("insert into user values(2,'宋宁宁',1);"); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //获取当前线程名 Log.d(TAG, "query(),当前线程==="+Thread.currentThread().getName()); table = getTableName(uri); if (table == null) { throw new IllegalArgumentException("不支持该uir"); } return mDatabase.query(table,projection,selection,selectionArgs,null,null,sortOrder,null); } private String getTableName(Uri uri) { String tableName = null; switch (mUriMatcher.match(uri)) { case BOOK_URI_CODE: tableName = DbOpenHelper.BOOK_TABLE; break; case USER_URI_CODE: tableName = DbOpenHelper.USER_TABLE; break; } return tableName; } @Override public String getType(Uri uri) { Log.d(TAG, "getType()"); return null; } @Override public Uri insert(Uri uri, ContentValues values) { table = getTableName(uri); mDatabase.insert(table,null,values); mContext.getContentResolver().notifyChange(uri,null); Log.d(TAG, "insert()"); return uri; } public int delete(Uri uri, String s, String[] strings) { table = getTableName(uri); int count = mDatabase.delete(table,s,strings); if (count>0) { mContext.getContentResolver().notifyChange(uri,null); } Log.d(TAG, "delete()"); return count; } @Override public int update(Uri uri, ContentValues values, String s, String[] strings) { Log.d(TAG, "update()"); table = getTableName(uri); int row = mDatabase.update(table,values,s,strings); if (row>0) { mContext.getContentResolver().notifyChange(uri,null); } Log.d(TAG, "delete()"); return row; } }

    3.创建数据库

    package com.zhoujian.contentprivider.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by zhoujian on 2016/11/30. */ public class DbOpenHelper extends SQLiteOpenHelper { //数据库名 private static final String DB_NAME="provider.db"; //书籍表名 public static final String BOOK_TABLE = "book"; //用户表名 public static final String USER_TABLE = "user"; //数据库版本 private static final int DB_VERSION = 1; public DbOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase database) { //执行创建书籍表的sql语句(一个字段 name) database.execSQL("CREATE TABLE IF NOT EXISTS " + BOOK_TABLE + "(_id INTEGER PRIMARY KEY," + "name TEXT)"); //执行创建用户表的sql语句(两个字段 name 和 sex) database.execSQL("CREATE TABLE IF NOT EXISTS " + USER_TABLE + "(_id INTEGER PRIMARY KEY," + "name TEXT," + "sex INT)"); } @Override public void onUpgrade(SQLiteDatabase database, int i, int i1) { } }

    4.实现进程间通信

    package com.zhoujian.contentprivider.activity; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; import com.zhoujian.contentprivider.R; import com.zhoujian.contentprivider.bean.Book; import com.zhoujian.contentprivider.bean.User; /** ContentPrivider:内容提供者 ContentPrivider是Android中提供的专门用于不同应用间进行数据共享的方式 当我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。 ContentPrivider可实现进程间通信 ContentPrivider的底层是Binder */ public class MainActivity extends Activity { public static final String TAG = "MainActivity"; private Uri bookUri; private Uri userUri; private Cursor bookCursor; private int mInt; private String mString; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { //书籍的url bookUri = Uri.parse("content://com.zhoujian.contentPrivider.bookprivider/book"); ContentValues values = new ContentValues(); values.put("_id",4); values.put("name","市场营销学"); //插入书籍 getContentResolver().insert(bookUri,values); //查询书籍 bookCursor = getContentResolver().query(bookUri, new String[]{"_id", "name"}, null, null, null); Book book = null; while (bookCursor.moveToNext()) { book = new Book(); mInt = bookCursor.getInt(0); book.setBookId(mInt); mString = bookCursor.getString(1); book.setBookName(mString); Log.d(TAG, book.toString()); } bookCursor.close(); }catch (Exception e){ e.printStackTrace(); } //用户url userUri = Uri.parse("content://com.zhoujian.contentPrivider.bookprivider/user"); //查询用户 Cursor userCursor = getContentResolver().query(userUri, new String[]{"_id", "name","sex"}, null, null, null); User user = null; while (userCursor.moveToNext()) { user = new User(); int userId = userCursor.getInt(0); user.setUserId(userId); String userName = userCursor.getString(1); user.setUserName(userName); int isMale = userCursor.getInt(2); user.setIsMale(isMale); Log.d(TAG, user.toString()); } userCursor.close(); } }

    MainActivity和BookPrivider属于不同的进程

    5.最后附上源码结构、下载地址和运行结果截图

    下载地址:https://github.com/zeke123/ContentPrivider

    转载请注明原文地址: https://ju.6miu.com/read-950039.html

    最新回复(0)