日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android系統(tǒng)服務(wù)是如何獲取的

瀏覽:51日期:2022-09-20 11:10:31
關(guān)于獲取系統(tǒng)服務(wù)的猜想

Android獲取系統(tǒng)服務(wù)一般都需要用getSystemService指定系統(tǒng)服務(wù)名稱(chēng)獲?。?/p>

val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager

在實(shí)際開(kāi)發(fā)中,當(dāng)我們需要編寫(xiě)提供某一業(yè)務(wù)流程處理的Manager,通常會(huì)實(shí)現(xiàn)為單例。那么上面那行代碼背后發(fā)生了什么,為什么Android不使用單例模式呢?下面我們觀察Android是如何設(shè)計(jì)獲取系統(tǒng)服務(wù)的,它如何從應(yīng)用側(cè)到達(dá)系統(tǒng)側(cè)。

可以思考一下,不在每個(gè)服務(wù)中單獨(dú)使用單例的原因大概是因?yàn)锳ndroid提供的系統(tǒng)服務(wù)眾多,都使用getSystemService方法相當(dāng)于提供了統(tǒng)一的入口。同時(shí)因?yàn)榉椒▍?shù)中的服務(wù)名稱(chēng)字符串,可以提供一個(gè)Map來(lái)統(tǒng)一存放各種服務(wù)實(shí)例,這與單例模式十分接近,相當(dāng)于統(tǒng)一管理各種單例的變種。那么事實(shí)是不是這樣呢?(下方源碼只保留關(guān)鍵代碼,API 30)

獲取系統(tǒng)服務(wù)源碼實(shí)現(xiàn)

各種繼承或者持有Context的組件的getSystemService方法都會(huì)調(diào)用ContextImpl的同名方法:

//ContextImpl.java public Object getSystemService(String name) { return SystemServiceRegistry.getSystemService(this, name); }

SystemServiceRegistry一看就是統(tǒng)一注冊(cè)系統(tǒng)服務(wù)的地方:

//SystemServiceRegistry.java public static Object getSystemService(ContextImpl ctx, String name) { final ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name); final Object ret = fetcher.getService(ctx); return ret; }

這里我們確實(shí)發(fā)現(xiàn)了Map,可卻不是從String到系統(tǒng)服務(wù)的Map,SYSTEM_SERVICE_FETCHERS的類(lèi)型為Map<String, ServiceFetcher<?>>。

//SystemServiceRegistry.java static abstract interface ServiceFetcher<T> { T getService(ContextImpl ctx); }

這個(gè)SystemServiceRegistry中的內(nèi)部接口ServiceFetcher,看上去像是各種系統(tǒng)服務(wù)的工廠接口。我們看它的實(shí)現(xiàn)類(lèi):

//SystemServiceRegistry.java static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> { private final int mCacheIndex; CachedServiceFetcher() { mCacheIndex = sServiceCacheSize++; } @Override public final T getService(ContextImpl ctx) { final Object[] cache = ctx.mServiceCache; T ret = null; T service = (T) cache[mCacheIndex]; if (service != null) {ret = service; } else {service = createService(ctx);cache[mCacheIndex] = service;ret = service; } return ret; } public abstract T createService(ContextImpl ctx) throws ServiceNotFoundException; }

getService方法精簡(jiǎn)了大量保證線程安全的同步措施,只保留了最核心的邏輯??梢钥吹搅碛幸粋€(gè)類(lèi)型為Object[]的數(shù)組ctx.mServiceCache,getService從中用下標(biāo)mCacheIndex獲取系統(tǒng)服務(wù),如果服務(wù)為空則使用createService方法創(chuàng)建服務(wù)并放在數(shù)組中??梢哉f(shuō),這個(gè)ctx.mServiceCache數(shù)組起到了我們最初設(shè)想的從String到系統(tǒng)服務(wù)的Map的存放所有系統(tǒng)服務(wù)的作用。這個(gè)映射變?yōu)榱耍?/p>

假象的映射(從String到系統(tǒng)服務(wù)) <=> SYSTEM_SERVICE_FETCHERS映射(從String到ServiceFetcher) + ctx.mServiceCache數(shù)組(ServiceFetcher中的mCacheIndex下標(biāo)到系統(tǒng)服務(wù))

這個(gè)SYSTEM_SERVICE_FETCHERS映射在SystemServiceRegistry的靜態(tài)初始化快中被統(tǒng)一填充,同時(shí)提供了上方?jīng)]有實(shí)現(xiàn)的createService:

//SystemServiceRegistry.java static { registerService(Context.WINDOW_SERVICE, WindowManager.class,new CachedServiceFetcher<WindowManager>() { @Override public WindowManager createService(ContextImpl ctx) {return new WindowManagerImpl(ctx); }}); } private static <T> void registerService(@NonNull String serviceName, @NonNull Class<T> serviceClass, @NonNull ServiceFetcher<T> serviceFetcher) { SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher); }

SystemServiceRegistry類(lèi)初始化時(shí),ctx.mServiceCache系統(tǒng)服務(wù)數(shù)組還是空的,當(dāng)某一系統(tǒng)服務(wù)需要時(shí),上方CachedServiceFetcher中g(shù)etService會(huì)調(diào)用createService創(chuàng)建服務(wù)并存放在特定mCacheIndex下標(biāo)中。

總結(jié)一下就是:在Android獲取系統(tǒng)服務(wù)的流程中,使用工廠模式創(chuàng)建系統(tǒng)服務(wù),使用Map管理工廠,使用數(shù)組管理系統(tǒng)服務(wù)實(shí)例。每種服務(wù)在每個(gè)ContextImpl中的數(shù)組中最多只有一個(gè),且使用前不會(huì)提前創(chuàng)建,這點(diǎn)和單例的懶漢式是一致的。

真正的系統(tǒng)服務(wù)提供者

我們知道Android Framework中系統(tǒng)服務(wù)是運(yùn)行在系統(tǒng)進(jìn)程中,需要通過(guò)Binder機(jī)制與應(yīng)用進(jìn)程通信,如果我們不考慮系統(tǒng)側(cè)實(shí)現(xiàn),上面拿到的類(lèi)真的應(yīng)用側(cè)的Binder類(lèi)么?其實(shí)并不全是,依舊查看工廠類(lèi)中的工廠方法:

上面獲取到的服務(wù)類(lèi),有些類(lèi)的確是系統(tǒng)側(cè)的系統(tǒng)服務(wù)對(duì)應(yīng)到應(yīng)用側(cè)的Binder類(lèi),比如AlarmManager:

//SystemServiceRegistry.java registerService(Context.ALARM_SERVICE, AlarmManager.class,new CachedServiceFetcher<AlarmManager>() { @Override public AlarmManager createService(ContextImpl ctx) throws ServiceNotFoundException {IBinder b = ServiceManager.getServiceOrThrow(Context.ALARM_SERVICE);IAlarmManager service = IAlarmManager.Stub.asInterface(b);return new AlarmManager(service, ctx); }}); 有些則是對(duì)這些Binder類(lèi)的直接封裝,比如ActivityManager:

//SystemServiceRegistry.javaregisterService(Context.ACTIVITY_SERVICE, ActivityManager.class,new CachedServiceFetcher<ActivityManager>() { @Override public ActivityManager createService(ContextImpl ctx) {return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }});

其中大量的方法使用getService與getTaskService進(jìn)行委托:

//ActivityManager.java public void killUid(int uid, String reason) { try { getService().killUid(UserHandle.getAppId(uid), UserHandle.getUserId(uid), reason); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } public List<RunningTaskInfo> getRunningTasks(int maxNum) throws SecurityException { try { return getTaskService().getTasks(maxNum); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } public static IActivityManager getService() { return IActivityManagerSingleton.get(); } private static IActivityTaskManager getTaskService() { return ActivityTaskManager.getService(); }

而getService與getTaskService都是單例方法,另外使用ServiceManager獲取真正的Binder類(lèi)。

另外還有些系統(tǒng)服務(wù)為了便于使用,封裝得更加復(fù)雜,比如WindowManager:

registerService(Context.WINDOW_SERVICE, WindowManager.class,new CachedServiceFetcher<WindowManager>() { @Override public WindowManager createService(ContextImpl ctx) {return new WindowManagerImpl(ctx); }});

這里的各不同Context的WindowManagerImpl會(huì)統(tǒng)一調(diào)用到WindowManagerGlobal,而WindowManagerGlobal在addView時(shí)會(huì)創(chuàng)建ViewRootImpl,并將Binder類(lèi)WindowSession傳遞給ViewRootImpl,由ViewRootImpl完成與WMS通信的工作。

以上實(shí)現(xiàn)了獲取系統(tǒng)服務(wù)時(shí)從應(yīng)用側(cè)到達(dá)系統(tǒng)側(cè)的過(guò)程。

以上就是Android系統(tǒng)服務(wù)是如何獲取的的詳細(xì)內(nèi)容,更多關(guān)于Android系統(tǒng)服務(wù)獲取的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一二av| 久久精品国产99国产精品| 亚洲不卡系列| 国产丝袜一区| 亚洲欧美日本国产| 伊人久久亚洲热| 久久中文字幕二区| 91欧美在线| 久久午夜精品| 亚洲精品在线影院| 激情综合婷婷| 麻豆mv在线观看| 精品一区二区三区中文字幕 | 亚洲天堂1区| 国产欧美日韩一区二区三区四区| 伊人久久大香伊蕉在人线观看热v| 国精品一区二区| 日韩午夜在线| 日韩视频二区| 日日夜夜免费精品| 亚洲精品一二| 国产精品欧美一区二区三区不卡| 国产精选久久| 欧美激情另类| japanese国产精品| 亚洲综合欧美| 男女男精品视频网| 精品一区免费| 亚洲久久在线| 精品视频免费| 国产精品二区不卡| 日本欧美韩国一区三区| 天堂av在线一区| 欧美a级片一区| 日本不卡视频在线观看| 国产欧美日韩视频在线| 麻豆91精品视频| 日韩精品永久网址| 99视频一区| 日韩精品免费一区二区三区| 在线一区二区三区视频| 精品国产乱码久久久久久樱花| 国产精品日本一区二区不卡视频| av资源中文在线| 视频一区国产视频| 国产精品一区2区3区| 欧美日韩水蜜桃| 91在线成人| 99re国产精品| 国精品一区二区| 日韩欧美午夜| 米奇777超碰欧美日韩亚洲| 午夜精品影视国产一区在线麻豆| 欧美激情视频一区二区三区免费 | 精品一区毛片| 国产精品久久久久9999高清| 亚洲欧美日本日韩| 国产盗摄——sm在线视频| 日韩不卡一区二区三区| 黑丝一区二区三区| 国产精品白丝一区二区三区| 中文不卡在线| 好看不卡的中文字幕| 你懂的国产精品| 欧美成人aaa| 久久亚洲国产| 综合日韩av| 国产精品久久777777毛茸茸| 精品一区二区三区中文字幕在线| 日韩一区精品| 三级欧美韩日大片在线看| 国产v日韩v欧美v| 国产精品一区二区三区www| 水野朝阳av一区二区三区| 日韩在线观看一区| 国精品产品一区| 久久精品国产网站| 国产精品17p| 国产精品麻豆成人av电影艾秋| 欧美精品中文字幕亚洲专区| 日韩影片在线观看| 国产精品一国产精品k频道56| 欧美在线首页| 久久国产麻豆精品| 久久福利毛片| 亚洲香蕉久久| 日本不卡一二三区黄网| 日本在线视频一区二区| 欧美一级网站| 亚洲黄色免费看| 欧美日韩激情| 综合亚洲自拍| 国产精品美女在线观看直播| 高清在线一区| 欧美日一区二区在线观看| 免费观看在线综合色| 欧美日韩xxxx| 国产高潮在线| 亚洲男女av一区二区| 蜜臀av一区二区三区| 日本午夜精品| 日韩免费小视频| 欧美性感美女一区二区| 欧美激情麻豆| 视频在线观看一区二区三区| 亚洲尤物在线| 91精品啪在线观看国产18| 女同性一区二区三区人了人一| 日韩影院在线观看| 日韩成人高清| 亚洲人妖在线| 精品久久电影| 蜜桃av一区二区在线观看| 日本久久二区| 久久久久久一区二区| 爽好久久久欧美精品| 欧美aaaaaa午夜精品| 91九色精品| 国产精品久久久久久久免费软件 | 欧美日韩黑人| 高清一区二区| 成人自拍av| 欧美高清一区| 日本精品不卡| 日韩欧美精品一区| 影院欧美亚洲| 欧美在线精品一区| 精品久久影院| 三级欧美韩日大片在线看| 五月激激激综合网色播| 国产欧美亚洲一区| 国产福利91精品一区二区| 日韩电影免费在线观看| 性欧美长视频| 黄色在线观看www| 亚洲二区精品| 亚洲不卡系列| 福利一区二区三区视频在线观看| 久久国产精品免费一区二区三区| 欧美天堂视频| 911精品国产| 国产欧美自拍| 欧美专区一区| 日韩精彩视频在线观看| 精品网站999| 国产美女撒尿一区二区| 日本午夜免费一区二区| 免费成人在线影院| 免费在线观看视频一区| 亚洲成人一区| 亚洲一级黄色| 99精品99| 亚洲欧美高清| 国产视频一区免费看| 999国产精品永久免费视频app| 激情欧美国产欧美| 国产亚洲激情| 日韩精品社区| 国产精品麻豆成人av电影艾秋 | 国产精品亚洲综合在线观看| 国产精品午夜av| 日韩.com| 国产精品麻豆久久| 国产欧美日韩| 国产精品日韩欧美一区| 国产精品theporn| 成人在线网站| 视频一区欧美日韩| 无码日韩精品一区二区免费| 国产精品网址| 久久视频国产| 欧美日韩国产免费观看| 国产亚洲精品自拍| 欧美一级二级视频| 日韩欧美一区二区三区在线视频| 在线视频观看日韩| 国产精品成人国产| 亚洲成人免费| 国产精品日韩精品中文字幕| 国产精品成久久久久| 日韩精品一二三区| 国产精品免费精品自在线观看| 久久男人av资源站| 91精品福利观看| 蜜臀av免费一区二区三区| 欧美亚洲tv| 欧美91视频| 日本久久精品| 国产精品一区2区3区| 在线亚洲激情| 老牛影视精品| 国产精品亚洲欧美一级在线| 亚洲免费激情| av亚洲免费| 免费一二一二在线视频| 国产精品视频一区二区三区四蜜臂| 日韩一区二区免费看| 91一区二区| 日韩一区二区三区精品| 日本v片在线高清不卡在线观看|