Android应用程序组件Content Provider的共享数据更新通知机制分析(3)
- public class ArticlesAdapter {
- ......
- public long insertArticle(Article article) {
- ContentValues values = new ContentValues();
- values.put(Articles.TITLE, article.getTitle());
- values.put(Articles.ABSTRACT, article.getAbstract());
- values.put(Articles.URL, article.getUrl());
- Uri uri = resolver.insert(Articles.CONTENT_URI, values);
- String itemId = uri.getPathSegments().get(1);
- return Integer.valueOf(itemId).longValue();
- }
- ......
- }
- public class ArticlesProvider extends ContentProvider {
- ......
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- if(uriMatcher.match(uri) != Articles.ITEM) {
- throw new IllegalArgumentException("Error Uri: " + uri);
- }
- SQLiteDatabase db = dbHelper.getWritableDatabase();
- long id = db.insert(DB_TABLE, Articles.ID, values);
- if(id < 0) {
- throw new SQLiteException("Unable to insert " + values + " for " + uri);
- }
- Uri newUri = ContentUris.withAppendedId(uri, id);
- resolver.notifyChange(newUri, null);
- return newUri;
- }
- ......
- }
- resolver.notifyChange(newUri, null);
这个函数定义在frameworks/base/core/java/android/content/ContentResolver.java文件中:
- public abstract class ContentResolver {
- ......
- public void notifyChange(Uri uri, ContentObserver observer) {
- notifyChange(uri, observer, true /* sync to network */);
- }
- public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
- try {
- getContentService().notifyChange(
- uri, observer == null ? null : observer.getContentObserver(),
- observer != null && observer.deliverSelfNotifications(), syncToNetwork);
- } catch (RemoteException e) {
- }
- }
- ......
- }
- public final class ContentService extends IContentService.Stub {
- ......
- public void notifyChange(Uri uri, IContentObserver observer,
- boolean observerWantsSelfNotifications, boolean syncToNetwork) {
- ......
- try {
- ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>();
- synchronized (mRootNode) {
- mRootNode.collectObserversLocked(uri, 0, observer, observerWantsSelfNotifications,
- calls);
- }
- final int numCalls = calls.size();
- for (int i=0; i<numCalls; i++) {
- ObserverCall oc = calls.get(i);
- try {
- oc.mObserver.onChange(oc.mSelfNotify);
- ......
- } catch (RemoteException ex) {
- ......
- }
- }
- ......
- } finally {
- ......
- }
- }
- ......
- }
- public final class ContentService extends IContentService.Stub {
- ......
- public static final class ObserverNode {
- ......
- private void collectMyObserversLocked(boolean leaf, IContentObserver observer,
- boolean selfNotify, ArrayList<ObserverCall> calls) {
- int N = mObservers.size();
- IBinder observerBinder = observer == null ? null : observer.asBinder();
- for (int i = 0; i < N; i++) {
- ObserverEntry entry = mObservers.get(i);
- // Don't notify the observer if it sent the notification and isn't interesed
- // in self notifications
- if (entry.observer.asBinder() == observerBinder && !selfNotify) {
- continue;
- }
- // Make sure the observer is interested in the notification
- if (leaf || (!leaf && entry.notifyForDescendents)) {
- calls.add(new ObserverCall(this, entry.observer, selfNotify));
- }
- }
- }
- public void collectObserversLocked(Uri uri, int index, IContentObserver observer,
- boolean selfNotify, ArrayList<ObserverCall> calls) {
- String segment = null;
- int segmentCount = countUriSegments(uri);
- if (index >= segmentCount) {
- // This is the leaf node, notify all observers
- collectMyObserversLocked(true, observer, selfNotify, calls);
- } else if (index < segmentCount){
- segment = getUriSegment(uri, index);
- // Notify any observers at this level who are interested in descendents
- collectMyObserversLocked(false, observer, selfNotify, calls);
- }
- int N = mChildren.size();
- for (int i = 0; i < N; i++) {
- ObserverNode node = mChildren.get(i);
- if (segment == null || node.mName.equals(segment)) {
- // We found the child,
- node.collectObserversLocked(uri, index + 1, observer, selfNotify, calls);
- if (segment != null) {
- break;
- }
- }
- }
- }
- }
- }
- segment = getUriSegment("content://shy.luo.providers.articles/item/n",0);
- // Notify any observers at this level who are interested in descendents
- collectMyObserversLocked(false, observer, selfNotify, calls);
- segment = getUriSegment("content://shy.luo.providers.articles/item/n",1);
- // Notify any observers at this level who are interested in descendents
- collectMyObserversLocked(false, observer, selfNotify, calls);
- segment = getUriSegment("content://shy.luo.providers.articles/item/n",2);
- // Notify any observers at this level who are interested in descendents
- collectMyObserversLocked(false, observer, selfNotify, calls);
- for (int i=0; i<numCalls; i++) {
- ObserverCall oc = calls.get(i);
- try {
- oc.mObserver.onChange(oc.mSelfNotify);
- ......
- } catch (RemoteException ex) {
- ......
- }
- }
转载于:https://blog.51cto.com/shyluo/967021
Android应用程序组件Content Provider的共享数据更新通知机制分析(3)相关推荐
- Android应用程序组件Content Provider的共享数据更新通知机制分析
在Android系统中,应用程序组件Content Provider为不同的应用程序实现数据共享提供了基础设施,它主要通过Binder进程间通信机制和匿名共享内存机制来实现的.关于数据共享的另一个 话 ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)
在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过Content Provider组件来实现.那么,Content Provide ...
- Android应用程序组件Content Provider的启动过程源代码分析(6)
Step 17. ActivityThread.installProvider 这个函数定义在frameworks/base/core/java/android/app/Act ...
- Android应用程序组件Content Provider的启动过程源代码分析(1)
通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口.Content Provider一般是运行在独立的进 ...
- Android应用程序组件Content Provider简要介绍和学习计划
在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(2)
Step 7. ContentProviderProxy.query 这个函数定义在frameworks/base/core/java/android/content/Conten ...
- Android应用安全之Content Provider安全
android平台提供了Content Provider,将一个应用程序的指定数据集提供给其它应用程序.这些数据可以存储在文件系统.SQLite数据库中,或以任何其它合理的方式存储.其他应用可以通过C ...
- Android四大组件Content Provider使用实例
本文包含两个应用程序,其中,第一个应用程序命名为ArticlesProvider,它使用了SQLite数据库来维护一个文章信息列表,同时,它定义了访问这个文章信息列表的URI,这样,我们就可以通过一个 ...
- Android应用程序绑定服务(bindService)的过程源代码分析
Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部启动:前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部 ...
最新文章
- IEEE技术领域大奖公布:ML先驱上榜,大陆唯一获奖学者来自清华
- linux 进程 setuid,Linux SetUID(SUID)文件特殊权限用法详解
- scrapy使用笔记
- valgrind-3.11.0 交叉编译
- C printf()函数转换说明符
- .gpg 进程 linux,小知识之Linux系统中的最大进程数,最大文件描述,最大线程数...
- C++ string转字符串
- 道理与例子【人人都是产品经理:9009】
- 联网时浏览器跳出MSN中国网页
- 专业词汇及解释(持续更新,自用)
- 安装74cms时出现的错误
- 股票估值法研究报告_论述股票的估值方法
- 季节怎么形容_描写四季冬的词语 形容冬天季节的词语
- C1 驾驶证考试科目二考试心得
- 计算某一天是星期几(C语言,可运行)
- mqtt连接百度天工物接入平台
- Impala和Presto的时间处理
- Cookie、Session、Token、JWT 看一篇就够了
- 全文搜索引擎ElasticSearch
- 关于ES自定义script painless的问题