ContentService简单浅析
来源:互联网 发布:python 构造函数 编辑:程序博客网 时间:2024/06/05 03:17
简介
ContentService 是Android平台中数据更新通知的管理者,是数据同步服务的管理中枢,当操作Android手机中的联系人信息、通话记录等信息同步时,就可以通过它来完成。Android系统默认添加了同步监听。
源码
public final class ContentService extends IContentService.Stub { private static final String TAG = "ContentService"; private Context mContext; private boolean mFactoryTest; private final ObserverNode mRootNode = new ObserverNode(""); //数据结构中的树,其叶子节点的类型是ObServerEntry 保存url和IContentObServer对象 private SyncManager mSyncManager = null;//同步管理 private final Object mSyncManagerLock = new Object();//同步锁 private SyncManager getSyncManager() {//获取同步服务管理对象 synchronized(mSyncManagerLock) { try { //创建同步管理 负责数据同步服务 if (mSyncManager == null) mSyncManager = new SyncManager(mContext, mFactoryTest); } catch (SQLiteException e) { Log.e(TAG, "Can't create SyncManager", e); } return mSyncManager; } } // 此认证是需要权限的 @Override protected synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) { mContext.enforceCallingOrSelfPermission(Manifest.permission.DUMP, "caller doesn't have the DUMP permission"); //清空并获取认证 long identityToken = clearCallingIdentity(); try { if (mSyncManager == null) { pw.println("No SyncManager created! (Disk full?)"); } else { mSyncManager.dump(fd, pw); } } finally { restoreCallingIdentity(identityToken); } } //一个请求分发函数 @Override public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { try { // return super.onTransact(code, data, reply, flags); } catch (RuntimeException e) { // if (!(e instanceof SecurityException)) { Log.e(TAG, "Content Service Crash", e); } throw e; } } /**package*/ ContentService(Context context, boolean factoryTest) { mContext = context; mFactoryTest = factoryTest; getSyncManager();//获得同步管理 } //注册监听同步uri是表地址 观察者实际上是一个类型为Transport的Binder本地对象 public void registerContentObserver(Uri uri, boolean notifyForDescendents, IContentObserver observer) { if (observer == null || uri == null) { throw new IllegalArgumentException("You must pass a valid uri and observer"); } synchronized (mRootNode) { //添加进行管理 mRootNode.addObserverLocked(uri, observer, notifyForDescendents, mRootNode); if (Config.LOGV) Log.v(TAG, "Registered observer " + observer + " at " + uri + " with notifyForDescendents " + notifyForDescendents); } } //移除监听 public void unregisterContentObserver(IContentObserver observer) { if (observer == null) { throw new IllegalArgumentException("You must pass a valid observer"); } synchronized (mRootNode) { //移除 mRootNode.removeObserverLocked(observer); if (Config.LOGV) Log.v(TAG, "Unregistered observer " + observer); } } //数据发生改变时触发 public void notifyChange(Uri uri, IContentObserver observer, boolean observerWantsSelfNotifications, boolean syncToNetwork) { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "Notifying update of " + uri + " from observer " + observer + ", syncToNetwork " + syncToNetwork); } // 权限检查 long identityToken = clearCallingIdentity(); 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 { //调用客户端的回调 //数据改变时,ContentService调用客户端注册的IContentObserver的OnChange函数 oc.mObserver.onChange(oc.mSelfNotify); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "Notified " + oc.mObserver + " of " + "update at " + uri); } } catch (RemoteException ex) { synchronized (mRootNode) { Log.w(TAG, "Found dead observer, removing"); IBinder binder = oc.mObserver.asBinder(); final ArrayList<ObserverNode.ObserverEntry> list = oc.mNode.mObservers; int numList = list.size(); for (int j=0; j<numList; j++) { ObserverNode.ObserverEntry oe = list.get(j); if (oe.observer.asBinder() == binder) { list.remove(j); j--; numList--; } } } } } if (syncToNetwork) { SyncManager syncManager = getSyncManager(); if (syncManager != null) { //同步 syncManager.scheduleLocalSync(null /** all accounts */, uri.getAuthority()); } } } finally { restoreCallingIdentity(identityToken); } } //类 树结构 叶节点 public static final class ObserverCall { final ObserverNode mNode; final IContentObserver mObserver; final boolean mSelfNotify; ObserverCall(ObserverNode node, IContentObserver observer, boolean selfNotify) { mNode = node; mObserver = observer; mSelfNotify = selfNotify; } } //请求同步 public void requestSync(Account account, String authority, Bundle extras) { ContentResolver.validateSyncExtrasBundle(extras); // 权限检查 long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.scheduleSync(account, authority, extras, 0 /** no delay */, false /** onlyThoseWithUnkownSyncableState */); } } finally { restoreCallingIdentity(identityToken); } } //清除所有同步操作 public void cancelSync(Account account, String authority) { //权限检查 long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.clearScheduledSyncOperations(account, authority); syncManager.cancelActiveSync(account, authority); } } finally { restoreCallingIdentity(identityToken); } } //获取同步类型 public SyncAdapterType[] getSyncAdapterTypes() { // 权限检查 long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); return syncManager.getSyncAdapterTypes(); } finally { restoreCallingIdentity(identityToken); } } //是否自动同步 public boolean getSyncAutomatically(Account account, String providerName) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.getSyncStorageEngine().getSyncAutomatically( account, providerName); } } finally { restoreCallingIdentity(identityToken); } return false; } //设置是否同步 public void setSyncAutomatically(Account account, String providerName, boolean sync) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.getSyncStorageEngine().setSyncAutomatically( account, providerName, sync); } } finally { restoreCallingIdentity(identityToken); } } //添加定时同步 public void addPeriodicSync(Account account, String authority, Bundle extras, long pollFrequency) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); long identityToken = clearCallingIdentity(); try { getSyncManager().getSyncStorageEngine().addPeriodicSync( account, authority, extras, pollFrequency); } finally { restoreCallingIdentity(identityToken); } } //移除定时同步 public void removePeriodicSync(Account account, String authority, Bundle extras) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); long identityToken = clearCallingIdentity(); try { getSyncManager().getSyncStorageEngine().removePeriodicSync(account, authority, extras); } finally { restoreCallingIdentity(identityToken); } } //获取定时同步的选项列表 public List<PeriodicSync> getPeriodicSyncs(Account account, String providerName) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); long identityToken = clearCallingIdentity(); try { return getSyncManager().getSyncStorageEngine().getPeriodicSyncs( account, providerName); } finally { restoreCallingIdentity(identityToken); } } //是否支持一键同步 public int getIsSyncable(Account account, String providerName) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.getSyncStorageEngine().getIsSyncable( account, providerName); } } finally { restoreCallingIdentity(identityToken); } return -1; } //设置支持一键同步 public void setIsSyncable(Account account, String providerName, int syncable) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.getSyncStorageEngine().setIsSyncable( account, providerName, syncable); } } finally { restoreCallingIdentity(identityToken); } } //自动获取主机同步 public boolean getMasterSyncAutomatically() { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_SETTINGS, "no permission to read the sync settings"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.getSyncStorageEngine().getMasterSyncAutomatically(); } } finally { restoreCallingIdentity(identityToken); } return false; } //设置自动获取主机同步 public void setMasterSyncAutomatically(boolean flag) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.getSyncStorageEngine().setMasterSyncAutomatically(flag); } } finally { restoreCallingIdentity(identityToken); } } //是否可用 public boolean isSyncActive(Account account, String authority) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.getSyncStorageEngine().isSyncActive( account, authority); } } finally { restoreCallingIdentity(identityToken); } return false; } //获取当前同步的信息 public SyncInfo getCurrentSync() { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.getSyncStorageEngine().getCurrentSync(); } } finally { restoreCallingIdentity(identityToken); } return null; } //获得同步的状态信息 public SyncStatusInfo getSyncStatus(Account account, String authority) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.getSyncStorageEngine().getStatusByAccountAndAuthority( account, authority); } } finally { restoreCallingIdentity(identityToken); } return null; } // public boolean isSyncPending(Account account, String authority) { mContext.enforceCallingOrSelfPermission(Manifest.permission.READ_SYNC_STATS, "no permission to read the sync stats"); long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.getSyncStorageEngine().isSyncPending(account, authority); } } finally { restoreCallingIdentity(identityToken); } return false; } //添加状态改变监听 public void addStatusChangeListener(int mask, ISyncStatusObserver callback) { long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null && callback != null) { syncManager.getSyncStorageEngine().addStatusChangeListener(mask, callback); } } finally { restoreCallingIdentity(identityToken); } } //移除状态改变监听 public void removeStatusChangeListener(ISyncStatusObserver callback) { long identityToken = clearCallingIdentity(); try { SyncManager syncManager = getSyncManager(); if (syncManager != null && callback != null) { syncManager.getSyncStorageEngine().removeStatusChangeListener(callback); } } finally { restoreCallingIdentity(identityToken); } } public static IContentService main(Context context, boolean factoryTest) { ContentService service = new ContentService(context, factoryTest);//构造 ServiceManager.addService(ContentResolver.CONTENT_SERVICE_NAME, service);//注册 return service; } // 节点 public static final class ObserverNode { private class ObserverEntry implements IBinder.DeathRecipient { public final IContentObserver observer; public final boolean notifyForDescendents; private final Object observersLock; public ObserverEntry(IContentObserver o, boolean n, Object observersLock) { this.observersLock = observersLock; observer = o; notifyForDescendents = n; try { observer.asBinder().linkToDeath(this, 0); } catch (RemoteException e) { binderDied(); } } public void binderDied() { synchronized (observersLock) { removeObserverLocked(observer); } } } public static final int INSERT_TYPE = 0; public static final int UPDATE_TYPE = 1; public static final int DELETE_TYPE = 2; private String mName; private ArrayList<ObserverNode> mChildren = new ArrayList<ObserverNode>();//节点 private ArrayList<ObserverEntry> mObservers = new ArrayList<ObserverEntry>();//数据 public ObserverNode(String name) { mName = name; } private String getUriSegment(Uri uri, int index) { if (uri != null) { if (index == 0) { return uri.getAuthority(); } else { return uri.getPathSegments().get(index - 1); } } else { return null; } } private int countUriSegments(Uri uri) { if (uri == null) { return 0; } return uri.getPathSegments().size() + 1; } public void addObserverLocked(Uri uri, IContentObserver observer, boolean notifyForDescendents, Object observersLock) { addObserverLocked(uri, 0, observer, notifyForDescendents, observersLock); } private void addObserverLocked(Uri uri, int index, IContentObserver observer, boolean notifyForDescendents, Object observersLock) { // 添加观察者 if (index == countUriSegments(uri)) { mObservers.add(new ObserverEntry(observer, notifyForDescendents, observersLock)); return; } // 获取实例 String segment = getUriSegment(uri, index); int N = mChildren.size(); for (int i = 0; i < N; i++) { ObserverNode node = mChildren.get(i); if (node.mName.equals(segment)) { node.addObserverLocked(uri, index + 1, observer, notifyForDescendents, observersLock); return; } } // 没有则创建 ObserverNode node = new ObserverNode(segment); mChildren.add(node); node.addObserverLocked(uri, index + 1, observer, notifyForDescendents, observersLock); } public boolean removeObserverLocked(IContentObserver observer) { int size = mChildren.size(); for (int i = 0; i < size; i++) { boolean empty = mChildren.get(i).removeObserverLocked(observer); if (empty) { mChildren.remove(i); i--; size--; } } IBinder observerBinder = observer.asBinder(); size = mObservers.size(); for (int i = 0; i < size; i++) { ObserverEntry entry = mObservers.get(i); if (entry.observer.asBinder() == observerBinder) { mObservers.remove(i); // 死亡通知 则删掉它 observerBinder.unlinkToDeath(entry, 0); break; } } if (mChildren.size() == 0 && mObservers.size() == 0) { return true; } return false; }//leaf描述当前是否正在收集一个内容观察者 observer描述更新的内容观察者 slefNotify是否发送通知 calls回调 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); // 不要通知观察者 if (entry.observer.asBinder() == observerBinder && !selfNotify) { continue; } // 确保在通知队列中 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) { // 通知所有的观察者 collectMyObserversLocked(true, observer, selfNotify, calls); } else if (index < segmentCount){ segment = getUriSegment(uri, index); // 通知观察员 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)) { // 发现子节点 node.collectObserversLocked(uri, index + 1, observer, selfNotify, calls); if (segment != null) { break; } } } } }}
总结
1、ContentService承担了数据更新通知机制的工作;
2、同步服务管理的工作则委托给SyncManager完成;
3、使用红黑树数据结构管理数据;
- ContentService简单浅析
- ContentService源码分析
- ContentService注册和更新机制
- Android 系统服务之 ContentService
- asn浅析--简单介绍
- ContentProvider简单浅析
- AsyncSocket 浅析 简单使用
- ContentProvider简单浅析
- 浅析 - AIDL简单例子
- 简单工厂模式浅析
- 浅析ShardPreferences简单数据存储
- 基于N源码的ContentService数据通知机制
- Android System Server大纲之ContentService和ContentProvider原理剖析
- C#编写游戏简单例子浅析
- 浅析C# get set的简单用法
- 浅析C# get set的简单用法
- 浅析C# get set的简单用法
- C++中的new与delete简单浅析
- android的m、mm、mmm编译命令的使用
- <内存管理与进程调度>总结1
- 【用户指南:日常办公压缩软件操作三步骤】
- T-SQL象数组一样处理字符串、分割字符串
- Android ImageView 的 scaleType属性作用
- ContentService简单浅析
- servlet,filter, listener, interceptor 区别与联系
- Android_模拟时钟内时针、分针触摸转动
- java开发_获取访问者IP
- android layout_gravity失效的问题
- Java中的Map List Set等集合类
- PHP设计模式——责任链模式
- Linux设备驱动中得 DTS文件加载过程
- hibernate 映射文件配置默认值方法