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、使用红黑树数据结构管理数据;

原创粉丝点击