Android跨进程通信之ContentProvider

需求一:进程一操作或者得到进程二的数据

这里写图片描述

可以看到,可以通过这个几个方法远程调用另一个进程中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
精品内容独家发布平台


呈现与博客不一样的技术干货

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值