内容提供者ContentProvider实现跨程序共享数据的功能。
7.1内容提供者概述
若应用程序之间需要共享数据,则会用到ContentProvider内容提供者。功能是在不同程序之间实现数据共享,它不仅允许一个程序访问另一程序中的数据,同时还可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不被泄露。
它是不同应用程序之间进行数据共享的标准API,如果想要访问ContentProvider中共享的数据,就一定要借助ContentResolver类,该类的实例需要通过Context中的getContent Resolver()方法获取。
程序需要使用ContentProvider暴露数据,才能被其他程序操作。其他程序必须通过ContentResolver操作该程序暴露出来的数据,而该程序会将操作结果返回给ContentResolver,然后ContentResolver再将操作结构返回给其他程序。
1,数据模型:ContentProvider使用基于数据库模型的简单表格来提供需要共享的数据。
如果要查询,则需要知道各个字段对应的数据类型。Cursor对象提供了getInt(),getString(),getLong()等方法。
2,Uri:ContentResolver中的增,删,改,查方法是以Uri的形式对外提供数据的。Uri为ContentProvider中的数据建立了唯一标识符。Uri主要由三部分组成,分别是scheme,anthority和path。scheme是以content://开头的前缀,表示操作的数据被ContentProvider控制,不会被修改。anthority表示为ContentProvider设置的唯一标识,它用来区分不同的应用程序,一般用程序包名方式命令以避免产生冲突。path表示资源或数据,当访问者需要操作不同的数据时,该部分可以动态修改。
7.2创建内容提供者
首先要创建一个类继承抽象类ContentProvider,接着重写该类中的onCreate(),getType(),insert(),delete(),update(),query()方法。其中onCreate是在创建内容提供者调用的。insert(),delete(),update(),query()方法分别用于根据指定Uri对数据进行增,删,改,查操作。getType()用于返回MIME类型的数据。
7.3访问其他应用程序
步骤:①通过pause()方法解析Uri。
②遍过query()方法查询数据。
projection:查询内容。
selection:查询条件。
selectionArgs:替换掉参数selection中的?。
③通过while()循环语句遍历查询到的数据。
可以调用Cursor对象的close()方法来关闭Cursor释放资源。
7.4内容观察者
使用内容观察者ContentObserver可以实时监听ContentProvider共享的数据是否发生变化。
7.4.1什么是内容观察者
它用于观察指定Uri代表的数据的变化,当ContentObserVer观察到指定Uri代表的数据发生变化时,就会触发ContentObserver的onChange()方法。此时onChange()方法中使用ContentResovler可以查询到变化的数据。
使用ContentObserver观察程序的数据时,首先要在该程序的ContentProvider中调用ContentResovler的notifyChange()方法。调用此方法后,当其他程序操作该程序中的数据时,该程序会向消息中心发送数据变化的消息,此时另一个程序会观察到消息中心的数据有变化,会触发ContentObserver的onChange()方法。
通过onChange观察步骤:
①创建内容观察者:MyObserver,重写父类构造方法与onChange()方法。
②注册内容观察者:先用getContentResovler()获取对象。再用registerContentObserver()方法来注册创建内容观察者。
③取消注册内容观察者:用unregisterContentObserver()方法取消注册,通常在onDestroy()方法中进行。