基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManager的初始化
来源:互联网 发布:linux c 调用so动态库 编辑:程序博客网 时间:2024/05/01 20:06
应用程序开发者并不直接请求AccountManagerService服务。帐号相关的处理,由AccountManager提供接口。
按如下的方式获得AccountManager实例:
AccountManager accountManager = AccountManager.get(context);
实际上get()方法中,调用了Context.getSystemService()来创建实例:
public static AccountManager get(Context context) { if (context == null) throw new IllegalArgumentException("context is null"); return (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE); }
ContextImpl.getSystemService():
@Override public Object getSystemService(String name) { ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); return fetcher == null ? null : fetcher.getService(this); }
在此之前,ContextImpl类在一个静态块中注册AccountManager:
class ContextImpl extends Context { static { ... registerService(ACCOUNT_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); IAccountManager service = IAccountManager.Stub.asInterface(b); return new AccountManager(ctx, service); }}); ... }}
ServiceFetcher.getService():
public Object getService(ContextImpl ctx) { ArrayList<Object> cache = ctx.mServiceCache; Object service; synchronized (cache) { if (cache.size() == 0) { // Initialize the cache vector on first access. // At this point sNextPerContextServiceCacheIndex // is the number of potential services that are // cached per-Context. for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { cache.add(null); } } else { service = cache.get(mContextCacheIndex); if (service != null) { return service; } } service = createService(ctx); cache.set(mContextCacheIndex, service); return service; } }
可以看到,ContextImpl类维护一个缓存mServiceCache,当服务实例被创建,则将其加入到缓存中。
- 基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManager的初始化
- 基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManager的简要工作流程
- 基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManagerService系统服务的添加
- 基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号
- 基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号
- Andoird 4.2.2的Account Manager原理
- 基于Andoird 4.2.2的Account同步框架源代码学习——同步发起端
- 基于Android 4.2.2的Account Manager源代码分析学习:设备上帐号类型列表的获取
- 基于Android 4.2.2的Account Manager源代码分析学习:设备上帐号类型列表的获取
- 基于Andoird 4.2.2的同步框架源代码学习——同步提供端
- 基于Andoird 4.2.2的同步框架源代码学习——同步发起端
- 基于继承的初始化学习
- 基于 linux 平台的 libpcap 源代码分析
- 基于 linux 平台的 libpcap 源代码分析
- 基于 linux 平台的 libpcap 源代码分析
- 基于 linux 平台的 libpcap 源代码分析
- 基于 linux 平台的 libpcap 源代码分析
- 基于 linux 平台的 libpcap 源代码分析
- ORA-01034 或者 ORA-27101 终极解决办法(有图有真相)
- 凯撒加密
- 用宏区分操作系统和编译器
- CF 319D(Have You Ever Heard About the Word?-模拟)
- 计算机科学中最重要的32个算法
- 基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManager的初始化
- CCNode
- 找出删除两个文件相同部分Linux_grep,comm,awk
- GNUPLOT使用技巧
- 6410 otg 主控制器驱动移植
- CF 189 div2 D
- [队] 链式
- shellscript终止进程
- 正则表达式详解