context.getSystemService原理-3
2023-12-28 19:35:41 0 举报
"context.getSystemService"是Android开发中常用的一个方法,主要用于获取系统服务。它是通过Android系统的ServiceManager类的getService()方法来实现获取服务实例的。具体来说,在Android系统中,每个服务都对应一个ServiceManager的Binder对象。当我们调用context.getSystemService()方法时,它会调用ServiceManager的getService()方法,并传入指定服务的名称。ServiceManager会根据传入的名称找到对应的Binder对象,并返回该Binder对象的代理对象。这样,我们就获取到了系统服务的实例。需要注意的是,系统服务实例其实是代理对象,实际的服务运行在系统进程中。
作者其他创作
大纲/内容
N
将创建的service对象存到缓存中
STATE_UNINITIALIZED = 0;STATE_INITIALIZING = 1;STATE_READY = 2;STATE_NOT_FOUND = 3;
返回对象
是否状态为STATE_INITIALIZING
创建当前服务的顺序,也就是当前fetcher在缓存中的下标private final int mCacheIndex;
所以获取系统service对象接口会有ANR风险
createService为创建serviceFetcher时候,需要实现的方法,
如果状态是STATE_READY 或 STATE_NOT_FOUND ,那么就将其改为STATE_INITIALIZING
对象不为null
如果失败,那么是NULL
[开启了一个死循环]
Loop
serviceFetcher.getService入口
是否创建成功了
Y
将缓存的状态改为STATE_INITIALIZING
根据下标mCacheIndex直接从mServiceCache数组中读取对象记为cache
将状态置为STATE_READY
根据下标mCacheIndex从mServiceInitializationStateArray数组中读取当前服务状态
T getService(ContextImpl ctx)
跳出循环,返回service对象
从contextImpl中拿取缓存池 mServiceCache
ContextImpl.java
SystemServiceRegistry中类加载执行static代码块时候,每添加一个service,都会计数,表示当前一共有多少个服务,同时在每个service的Fetcher中会保存自己的计数,以便后续直接通过下标查找对应缓存
每个contextImpl实例生成时候,都会在自己的对象中保存一个服务映射的缓存池final Object[] mServiceCache = SystemServiceRegistry.createServiceCache();
用户记录当前各个服务的4种状态,是否已经初始化过,未初始化,可以用,未找到final int[] mServiceInitializationStateArray = new int[mServiceCache.length];
将状态置为STATE_NOT_FOUND
调用方法createService创建对象
CachedServiceFetcher<T>
唤醒其他正在获取service对象阻塞的线程cache.notifyAll();
同理,这里可能返回NULL
线程阻塞等待其他正在通过当前contextImpl对象来获取service的线程先处理完cache.wait();
[当前状态是否不是STATE_READY或STATE_NOT_FOUND]
Loop
0 条评论
下一页