-- ContentProvider CP自SDK17以后,默认是私有的,但对低版本的API是公开的。
ContentProvider(以下简称CP)是Android的四大组件之一,提供类似数据库增删查改的数据操作方式,同时还支持跨进程。
ContentProvider(内容提供者)用于提供数据的统一访问格式,封装底层的具体实现。对于数据的使用者来说,无需知晓数据的来源是数据库、文件、或者网络,只需简单地使用 ContentProvider提供的数据操作接口,也就是增(insert)、删(delete)、改(update)、查(query)四个过程。
AsyncQueryHandler是用于在ContentProvider上面执行异步的CRUD操作的工具类,CRUD操作会被放到一个单独的子线程中执行,当操作结束获取到结果后,将通过消息的方式传递给调用AsyncQueryHandler的线程,通常就是主线程。AsyncQueryHandler是一个抽象类,集成自Handler,通过封装ContentResolver、HandlerThread、AsyncQueryHandler等实现对ContentProvider的异步操作。
内容提供者ContentProvider的基本使用Demo- https://www.cnblogs.com/0616--ataozhijia/p/3754505.html
-- 数据库支持(SQLite), 内容提供器(ContentProvider)- https://yq.aliyun.com/articles/457952
内容提供器的使用- https://blog.youkuaiyun.com/qq_35495763/article/details/86600273
ContentProvider对象实例通过处理来之其他应用程序的请求来管理对结构化数据集的访问。最终调用ContentResolver对象的所有的访问形式,都会对应ContentProvider类的具体方法。
抽象类ContentProvider定义了六个抽象方法:query(),insert(),update(),delete(),getType(),onCreate()。
-- 应用程序数据共享shareuserid篇+ContentResolver+ContentProvider
ContentProvider同样基于Binder机制。ContentProvider只能保证进程间的互斥,无法保证进程内互斥。应用间程序数据共享.
使用ContentProvider在应用间共享数据- https://github.com/coderminer/Demo_Public/tree/master/gank
使用ContentProvider在应用间共享数据- https://www.jianshu.com/p/f69c7e0a4ba5
Android SDK的sample- http://developer.android.com/guide/tutorials/notepad/index.html
ContentProvider支持跨进程数据共享与"互斥、同步"杂谈- https://www.jianshu.com/p/857ea169d085
android 中为每一个apk分配一个userid,这个作为其身份的标识,当应用程序安装的时候,这个标志就会产生。android:sharedUserId="com.share_data",
两个应用程序共享一个userid,在b中需要访问a代码如下:Context ct=this.createPackageContext("com.stone.a", Context.CONTEXT_IGNORE_SECURITY);这样获取到a的context,那么即可获取其中相关的资源。这样在多个项目中可以共享资源.
如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种 方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
ContentProvider负责组织应用程序的数据;向其他应用程序提供数据;
ContentResolver则负责获取ContentProvider提供的数据;修改/添加/删除更新数据等;
ContentProvider 是如何组织数据的?组织数据主要包括:存储数据,读取数据,以数据库的方式暴露数据。数据的存储需要根据设计的需求,选择合适的存储结构,首选数据库,当然也可以选择本地其他文件,甚至可以是网络上的数据。数据的读取,以数据库的方式暴露数据这就要求,无论数据是如何存储的,数据最后必须以数据的方式访问。
<provider
android:authorities="com.example.demo.gank.provider"
android:name="com.example.demo.gank.provider.SettingsProvider"
android:readPermission="com.example.demo.gank.provider.READ_PROVIDER"
android:writePermission="com.example.demo.gank.provider.WRITE_PROVIDER"
android:exported="true">
<uses-permission android:name="com.example.demo.gank.provider.READ_PROVIDER"/>
<uses-permission android:name="com.example.demo.gank.provider.WRITE_PROVIDER"/>
> 启动ContentProvider
发布ContentProvider分两种情况:Provider进程尚未启动,Provider进程已启动但未发布。
场景一(Provider进程尚未启动):system_server进程调用startProcessLocked()创建provider进程且attach到system_server后, 通过binder call到provider进程执行AT.bindApplication()方法;
场景二(Provider进程已启动但未发布): 获取provider的过程, 发现provider进程已存在且attach到system_server,但所对应的provider还没有发布, 通过binder call到provider进程执行AT.scheduleInstallProvider方法。
殊途同归,这两种途径最终都会合入installContentProviders过程。
关于provider分为stable provider和unstable provider, 在于引用计数 的不同,一句话来说就是stable provider建立的是强连接, 客户端进程的与provider进程是存在依赖关系, 即provider进程死亡则会导致客户端进程被杀.
理解ContentProvider原理- http://gityuan.com/2016/07/30/content-provider/
ContentProvider引发闪退之谜- https://mp.weixin.qq.com/s/hveaSdNkugC-k2X8jmmJCg
Android:关于ContentProvider的知识都在这里了!- http://blog.youkuaiyun.com/carson_ho/article/details/76101093
Android--ContentProvider demo- https://www.cnblogs.com/plokmju/p/android_ContentProvider.html