您的位置:首页 > 移动开发 > Android开发

Android使用ContentProvider实现多进程通信

2017-02-20 14:08 288 查看
Android的IPC方式之一,ContentProvider底层实现是Binder。

我们要使其能够对外部应用提供数据,外部应用通过ContentProvider来访问SQLite里面的数据

//DBopenHelper.java

这是一个数据库的简单实现

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
* Created by xsl on 2017/2/20.
*/

public class DBOpenHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "book_provider.db";
public static final String BOOK_TABLE_NAME = "book";
public static final String USER_TABLE_NAME = "user";

private static final int DB_VERSION = 1;

//书和用户信息表
private String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS "
+ BOOK_TABLE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT)";

private String CREATE_USER_TABLE = "CREATE TABLE IF NOT EXISTS "
+ USER_TABLE_NAME + "(_id INTEGER PRIMARY KEY," + "name TEXT,"
+ "sex INT)";

public DBOpenHelper(Context context) {
super(context,DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK_TABLE);
db.execSQL(CREATE_USER_TABLE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

//BookProvider.java

我们分别为book和user指定了Uri

public class BookProvider extends ContentProvider {

private static final String TGA = "BookProvider";

private static final String AUTHORITY = "com.xsl.studychaptertwo.provider";

public static final Uri BOOK_CONTENT_Uri = Uri.parse("content://" + AUTHORITY + "/book");
public static final Uri USER_CONTENT_Uri = Uri.parse("content://" + AUTHORITY + "/user");

public static final int BOOK_URI_CODE = 0;
public static final int USER_URI_CODE = 1;
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

static {
sUriMatcher.addURI(AUTHORITY,"book",BOOK_URI_CODE);
sUriMatcher.addURI(AUTHORITY,"user",USER_URI_CODE);
}

private Context mContext;
private SQLiteDatabase mDb;

@Override
public boolean onCreate() {
Log.d(TGA,"onCreate, current thread:"+Thread.currentThread().getName());
mContext  = getContext();
//实际使用中不推荐在主线程中进行耗时操作
initProviderDate();
return true;
}

private void initProviderDate() {
mDb = new DBOpenHelper(mContext).getWritableDatabase();
mDb.execSQL("delete from " + DBOpenHelper.BOOK_TABLE_NAME);
mDb.execSQL("delete from " + DBOpenHelper.USER_TABLE_NAME);
mDb.execSQL("insert into book values(3,'Android');");
mDb.execSQL("insert into book values(4,'IOS');");
mDb.execSQL("insert into book values(5,'Html6');");
mDb.execSQL("insert into user values(1,'sen',1);");
mDb.execSQL("insert into user values(2,'xsl',0);");

}

@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.d(TGA,"query, current thread:"+Thread.currentThread().getName());
String table = getTableName(uri);
if (table == null){
throw new IllegalArgumentException("Unsupported URI: " + uri);
}

return mDb.query(table,projection,selection,selectionArgs,null,null,sortOrder,null);
}

@Nullable
@Override
public String getType(Uri uri) {
Log.d(TGA,"getType");
return null;
}

@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
String table = getTableName(uri);
if (table == null){
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
mDb.insert(table,null,values);
mContext.getContentResolver().notifyChange(uri,null);
return uri;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String table = getTableName(uri);
if (table == null){
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
int count = mDb.delete(table,selection,selectionArgs);
if (count > 0){
getContext().getContentResolver().notifyChange(uri,null);
}
return count;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
String table = getTableName(uri);
if (table == null){
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
int row = mDb.update(table,values,selection,selectionArgs);
if (row >0){
getContext().getContentResolver().notifyChange(uri,null);
}
return row;
}

private String getTableName(Uri uri) {
String tableName = null;
switch (sUriMatcher.match(uri)){
case BOOK_URI_CODE:
tableName = DBOpenHelper.BOOK_TABLE_NAME;
break;
case USER_URI_CODE:
tableName = DBOpenHelper.USER_TABLE_NAME;
break;
default:
break;
}
return tableName;
}
}

我们要注册这个BookProvider,使其运行在其他进程中:provider,才能叫多进程,一个自定义的权限,如果其他应用要访问它,则需要指定权限

<uses-permission android:name="com.xsl.PROVIDER"/>


<provider
android:authorities="com.xsl.studychaptertwo.provider"
android:name=".provider.BookProvider"
android:permission="com.xsl.PROVIDER"
android:process=":provider"/>


ProviderActivity.java
用来访问

public class ProviderActivity extends Activity {

private static final String TAG = "ProviderActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.provider_activity);

Uri bookUri = Uri.parse("content://com.xsl.studychaptertwo.provider/book");
ContentValues values = new ContentValues();
values.put("_id",6);
values.put("name", "它的机制");
getContentResolver().insert(bookUri,values);

Cursor bookCursor = getContentResolver().query(bookUri,new String[]{"_id","name"},null,null,null);
while (bookCursor.moveToNext()){
Book book = new Book();
book.bookId = bookCursor.getInt(0);
book.bookName = bookCursor.getString(1);
Log.d(TAG,"query book:" + book.toString());
}
bookCursor.close();

Uri userUri = Uri.parse("content://com.xsl.studychaptertwo.provider/user");
ContentValues uservalue = new ContentValues();
uservalue.put("_id",3);
uservalue.put("name","manzi");
uservalue.put("sex",1);
getContentResolver().insert(userUri,uservalue);
Cursor userCursor = getContentResolver().query(userUri,new String[]{"_id","name","sex"},null,null,null);
while (userCursor.moveToNext()){
User user = new User();
user.userId = userCursor.getInt(0);
user.userName = userCursor.getString(1);
user.isMale = userCursor.getInt(2) == 1;
Log.d(TAG,"query user:" + user.toString());
}
userCursor.close();

}
}

我们主要是查看Log日志,所以可以打开看到





可以看到insert的,和数据库里

关于Book.java和User.java很简单,仅仅几个属性

由于ProviderActivity和BookProvider运行在不同的进程中,也就构成了多进程通信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息