Android实现IPC进程间通信的6种方式 (六)ContentProvider篇

接前五篇
基础篇
bundle篇
文件共享篇
Messenger篇
AIDL篇

ContentProvider是Android提供的专用于不同应用间进行数据共享的一种方式,天然适合进程间通信。底层同样是通过Binder实现,但是因为Android系统已经帮我们进行了封装,因此使用起来很简单
Android系统内置了许多ContentProvider,常用的是通讯录、日程表等,我们只需要通过insert、delete、update、query方法就可以完成

本篇我们来用ContentProvider实现进程间通信

1、创建一个MyContentProvider继承自ContentProvider,并实现onCreate,getType,query,insert,delete,update这6个方法
其中OnCreate顾名思义就是做一些初始化的工作,getType是来返回一个Uri所对应的MIME类型,比如图片、视频,较为复杂,如果用不到这个方法时返回nul即可,剩下的query,insert,delete,update是实现增删改查。这6个方法中,只有OnCreate运行在主线程,其他都在Binder线程池中

public class MyContentProvider extends ContentProvider {
    private static final String TAG = "MyContentProvider";
    
    @Override
    public boolean onCreate() {
        Log.d(TAG,"onCreate, current Thread:" + Thread.currentThread().getName());
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Log.d(TAG,"query, current Thread:" + Thread.currentThread().getName());
        return null;
    }

    @Override
    public String getType(Uri uri) {
        Log.d(TAG,"getType, current Thread:" + Thread.currentThread().getName());
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.d(TAG,"insert, current Thread:" + Thread.currentThread().getName());
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.d(TAG,"delete, current Thread:" + Thread.currentThread().getName());
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.d(TAG,"update, current Thread:" + Thread.currentThread().getName());
        return 0;
    }
}

2、在manifest文件中注册MyContentProvider
android:authorities是ContentProvider的唯一标识,外部应用通过这个标识访问我们的MyContentProvider;android:permission表示外部应用想要用我们的MyContentProvider就必须声明这个权限;

<provider
    android:authorities="com.practise.contentprovider.mycontentprovider"
    android:name=".MyContentProvider"
    android:process=":provider"
    android:permission="com.practise.PROVIDER">
</provider>

3、现在就可以访问MyContentProvider了,我们来用一个Activity访问它

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout layout = new LinearLayout(this);
       
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值