ContentProvider 顾名思义,内容提供者。至于其内部内容是以什么样的形式存储的,如 数据库sqlite,文件等方式,对于使用者是不关心的,使用者来说只要能获取、更新数据就行。
关于ContentProvider/ContentResolver的示例,网上已经有很多,大同小异。这里只介绍本人开发过程中常用到ContentProvider/ContentResolver的地方:
- 存储数据, 供其他app使用;
- 存储数据,发出数据库更新通知,供本app和其他app使用
- 用ContentResolver读取系统已有的存储参数
下面是每种方法使用时的注意事项:
一、存取数据,供其他app使用
1,要定义唯一的matchurl, 即AUTHORITY, 这个字符串必须是盒子上其他应用没有用过的,否则安装的时候会失败,提示 Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]
2,要在 AndroidManifest.xml 里面添加provider的声明
要注意两个enable:
android:enable 为true, app开启的时候系统实例化该provider,不用手动代码实例; android:exported 为true, 则表示其他app可以使用或修改该app共享出来的数据
3,如果该provider 提供的数据需要在不启动该app情况下使用, 那么需要在该app内实现收到 android.intent.action.BOOT_COMPLETED 通知的时候就实例化该provider,示例如下:
Receiver里 onRecieve 调用的时候在不启动该app的情况下实例化provider
二、发出数据库更新通知
Provider 数据更新通知非常有用, 可以使得数据需求方及时更新、刷新数据
数据使用方要定义observer 并注册
resolver.registerContentObserver(CONTENT_URI, true, contentObserver);
这样provider方数据发生更新、删除后,使用方能及时获取到通知并刷新本地数据
三、用ContentResolver读取系统参数
这个功能很少用到,因为系统存储参数,只有特殊情况下才用到
这个系统参数的provider在设备启动的时候已经由系统启动,具体app包名一般为:com.android.providers.settings
其数据库在盒子上的存储路径如下
通过工具查到数据里的内容,大都是系统设置的参数变量
这个数据库里的内容可以通过 content resolver 读取出来,读取方法也是平台现成的接口,
例如:
Settings.System.getString(context.getContentResolver(), "volume_ring");
关于ContentProvider/ContentResolver的使用,目前只用到以上三种方式,相比AIDL 通讯方法来讲,使用起来更方便。
相关demo代码:
Provider app: https://github.com/littlelixie/providertest
Resolver app: https://github.com/littlelixie/resolvertest