Android使用ContentProvider实现多进程通信
2017-02-20 14:08
288 查看
Android的IPC方式之一,ContentProvider底层实现是Binder。
我们要使其能够对外部应用提供数据,外部应用通过ContentProvider来访问SQLite里面的数据
//DBopenHelper.java
这是一个数据库的简单实现
//BookProvider.java
我们分别为book和user指定了Uri
我们要注册这个BookProvider,使其运行在其他进程中:provider,才能叫多进程,一个自定义的权限,如果其他应用要访问它,则需要指定权限
ProviderActivity.java
用来访问
我们主要是查看Log日志,所以可以打开看到
可以看到insert的,和数据库里
关于Book.java和User.java很简单,仅仅几个属性
由于ProviderActivity和BookProvider运行在不同的进程中,也就构成了多进程通信
我们要使其能够对外部应用提供数据,外部应用通过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运行在不同的进程中,也就构成了多进程通信
相关文章推荐
- Android中AIDL使用 及 AIDL实现进程间的通信
- Android基础--使用AIDL实现进程间的通信
- Android四大组件应用系列——使用ContentProvider实现跨进程通讯
- Android基础--使用AIDL实现进程间的通信之复杂类型传递
- Android开发之使用AIDL和远程服务实现进程通信
- android使用AIDL实现进程间的通信
- Android AIDL使用详解 实现进程间的通信
- Android 使用AIDL实现进程间的通信
- 【随心笔录】Android AIDL使用,实现跨进程通信
- Android 使用AIDL实现进程之间的通信(一)
- Androidk开发入门之使用AIDL实现进程通信
- Android 使用AIDL实现进程间的通信
- Android使用广播实现跨进程通信
- Android使用Messenger实现进程间双向通信
- Android 使用Messenger和Aidl实现跨进程通信
- Android 使用Messenger实现跨进程之间通信
- 使用管道实现进程间的双向通信
- 使用AIDL实现进程间的通信 (转载liuhe688)
- 初学Android,使用ContentResolver获取自己实现的ContentProvider的数据(五十六)
- Android 使用Handler实现Thread间通信