1.在同一系統(tǒng)中裝載了一個又一個的App骨坑,每個App之間有可能需要數(shù)據(jù)共享,App之間實現(xiàn)數(shù)據(jù)共享當(dāng)然可以使用SharedPreferences柬采、文件或數(shù)據(jù)庫等欢唾,但是這種方式不僅比較麻煩,而且存在嚴(yán)重的安全漏洞粉捻,所以在Android4.2以后不再推薦使用這種方式礁遣,而是推薦使用ContentProvider
2.其實ContentProvider和ContentResovler是成對使用,從字面上ContentProvider和ContentResovler可翻譯為:內(nèi)容提供者 和 內(nèi)容接收者
3.開發(fā)ContentProvider子類AlitanContentProvider
步驟1:子類需要實現(xiàn)父類方法query()肩刃、inser()祟霍、update()和delete()方法;
步驟2:在AndroidManifest中注冊ContentProvider并指定android:authorities屬性
4.AlitanContentProvider子類代碼實現(xiàn)如下
/**
* Created by alitan2014 on 2017/9/8.
*/
public classAlitanContentProviderextendsContentProvider {
privateHandlermHandler;
public voidonMessage(Handler handler){
mHandler= handler;
}
@Override
public booleanonCreate() {
JSONObject object =newJSONObject();
try{
object.put("method","onCreate");
}catch(JSONException e) {
e.printStackTrace();
}
Message message =newMessage();
message.obj= object;
message.what=0x123;
if(mHandler!=null){
mHandler.sendMessage(message);
}
System.out.println("onCreate");
return true;
}
@Nullable
@Override
publicCursorquery(@NonNullUri uri,@NullableString[] projection,@NullableString selection,@NullableString[] selectionArgs,@NullableString sortOrder) {
JSONObject object =newJSONObject();
try{
object.put("method","query");
Message message =newMessage();
message.obj= object;
message.what=0x123;
if(mHandler!=null){
mHandler.sendMessage(message);
}
System.out.println("onCreate");
}catch(JSONException e) {
e.printStackTrace();
}
return null;
}
@Nullable
@Override
publicStringgetType(@NonNullUri uri) {
return null;
}
@Nullable
@Override
publicUriinsert(@NonNullUri uri,@NullableContentValues values) {
JSONObject object =newJSONObject();
try{
object.put("method","insert");
Message message =newMessage();
message.obj= object;
message.what=0x123;
if(mHandler!=null){
mHandler.sendMessage(message);
}
System.out.println("insert");
}catch(JSONException e) {
e.printStackTrace();
}
returnUri.parse("www.baidu.com");
}
@Override
public intdelete(@NonNullUri uri,@NullableString selection,@NullableString[] selectionArgs) {
JSONObject object =newJSONObject();
try{
object.put("method","delete");
Message message =newMessage();
message.obj= object;
message.what=0x123;
if(mHandler!=null){
mHandler.sendMessage(message);
}
System.out.println("delete");
}catch(JSONException e) {
e.printStackTrace();
}
return0;
}
@Override
public intupdate(@NonNullUri uri,@NullableContentValues values,@NullableString selection,@NullableString[] selectionArgs) {
JSONObject object =newJSONObject();
try{
object.put("method","update");
Message message =newMessage();
message.obj= object;
message.what=0x123;
if(mHandler!=null){
mHandler.sendMessage(message);
}
System.out.println("update");
}catch(JSONException e) {
e.printStackTrace();
}
return0;
}
}
5.在Androidmanifest中注冊AlitanContentProvoder如下
android:authorities="alitan2014.com.contentprovider.AlitanContentProvider"
android:name=".AlitanContentProvider"
android:exported="true"
/>
6.在另外一個應(yīng)用獲取ContentResovler,并調(diào)用query(),insert(),update,delete()方法盈包,實際上是通過ContentProvider暴露在外部的URI浅碾,調(diào)用到了AlitanContentProvider中的query(),insert(),update,delete()方法,實現(xiàn)方法如下
ublic classMainActivityextendsAppCompatActivity {
privateContentResolverresolver;
privateUriuri= Uri.parse("content://alitan2014.com.contentprovider.AlitanContentProvider/");
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resolver= getContentResolver();
}
public voidquery(View view){
Cursor cursor =resolver.query(uri,null,"query_where",null,null);
Toast.makeText(MainActivity.this,"其他應(yīng)用返回的內(nèi)容:"+cursor,Toast.LENGTH_SHORT).show();
}
public voidinsert(View view){
ContentValues contentValues =newContentValues();
contentValues.put("method","insert");
Uri newUri =resolver.insert(uri,contentValues);
Toast.makeText(MainActivity.this,"新插入的URI為:"+newUri,Toast.LENGTH_SHORT).show();
}
public voidupdate(View view){
ContentValues contentValues =newContentValues();
contentValues.put("method","update");
intcount =resolver.update(uri,contentValues,"update_where",null);
Toast.makeText(MainActivity.this,"更新的的URI為:"+count,Toast.LENGTH_SHORT).show();
}
public voiddelete(View view){
ContentValues contentValues =newContentValues();
contentValues.put("method","update");
intcount =resolver.delete(uri,"delete_where",null);
Toast.makeText(MainActivity.this,"delete返回值為:"+count,Toast.LENGTH_SHORT).show();
}
}