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

Android跨进程通信之ContentProvider

2016-06-29 16:42 585 查看
需求一:进程一操作或者得到进程二的数据



可以看到,可以通过这个几个方法远程调用另一个进程中ContentProvider的方法。这里需要说一个call这个函数,它相当于就是远程调用。

具体用法如下:

1、实现ContentProvider

public class MyContentProvider extends ContentProvider {
private static final String TAG = "MyContentProvider";

@Override
public boolean onCreate() {
return false;
}

@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.d(TAG, "MyContentProvider query");
return null;
}

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

@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.d(TAG, "MyContentProvider insert");
return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.d(TAG, "MyContentProvider delete");
return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.d(TAG, "MyContentProvider update");
return 0;
}

@Nullable
@Override
public Bundle call(String method, String arg, Bundle extras) {
Log.d(TAG, "MyContentProvider call");
return super.call(method, arg, extras);
}
}


2、远程调用

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContentResolver resolver =  getContentResolver();
if (resolver != null) {
resolver.insert(Uri.parse("content://com.mirhunana.mycontentprovider/test"), new ContentValues());
resolver.query(Uri.parse("content://com.mirhunana.mycontentprovider/test"), null, null, null, null);
resolver.delete(Uri.parse("content://com.mirhunana.mycontentprovider/test"), null, null);
resolver.update(Uri.parse("content://com.mirhunana.mycontentprovider/test"), new ContentValues(), null, null);
resolver.call(Uri.parse("content://com.mirhunana.mycontentprovider/test"), "getService", null, null);
}

}
}


输入结果:

06-29 16:27:46.340 :remote D/MyContentProvider: MyContentProvider insert
06-29 16:27:46.345 :remote D/MyContentProvider: MyContentProvider query
06-29 16:27:46.350 :remote D/MyContentProvider: MyContentProvider delete
06-29 16:27:46.350 :remote D/MyContentProvider: MyContentProvider update
06-29 16:27:46.355 :remote D/MyContentProvider: MyContentProvider call


需求二:进程一观察进程二的某些数据的变化



使用观察者模式,在一个进程中观察另一个进程的数据情况,当另一个进程数据发生变化的时候,可以远程的通知该进程。

具体用法如下:

1、自定义ContentObserver

public class MyContentObsever extends ContentObserver {
private static final String TAG = "MyContentObsever";
public MyContentObsever(Handler handler) {
super(handler);
}

@Override
public void onChange(boolean selfChange) {
// 客户端可以得到数据源发生改变的通知
Log.d(TAG, "数据源发生了变化!");
super.onChange(selfChange);
}

@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
}
}


2、写一个客户端,注册监听,监听指定的URI

public class MainActivity extends Activity {

private MyContentObsever myContentObsever;
private Handler mHander = new Handler();

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

myContentObsever = new MyContentObsever(mHander);
getContentResolver().registerContentObserver(MyService.URI, false, myContentObsever);

startService(new Intent(this, MyService.class));
}
}


3、启动一个Service,Serivce运行在另外一个进程

public class MyService extends Service {
public static final String AUTHORITY = "mirhunana";
public static final Uri URI = Uri.parse("content://" + AUTHORITY + "/cache");
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public void onCreate() {
super.onCreate();
// 假设我们的数据源在这个服务中发生了改变,我们来通知客户端
ContentResolver resolver = getContentResolver();
resolver.notifyChange(URI, null);
}
}


具体可以参考文章:

ContentProvider和Uri详解

Android中ContentObserver的使用

欢迎关注微信公众号:DroidMind

精品内容独家发布平台





呈现与博客不一样的技术干货
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: