一.簡(jiǎn)述:?
Launcher這里我們研究主要是Launcher3(Android O平臺(tái))榜轿,各個(gè)手機(jī)公司自家的ROM Launcher汉规,咱們也看不到包斑,但是八九不離十啦摘昌,他們也應(yīng)該是重寫(xiě)關(guān)鍵函數(shù)來(lái)實(shí)現(xiàn)他們的需要斥杜。
二.流程詳述:?
1.核心方法:?
LauncherProvider#loadDefaultFavoritesIfNecessary()?
A.第一種:從某個(gè)設(shè)定好的APK(特定packageName)里面取得xml?
這里關(guān)鍵實(shí)現(xiàn)方法為:createWorkspaceLoaderFromAppRestriction()虱颗。在這會(huì)去從UserManager獲取對(duì)應(yīng)的Bundle對(duì)象,當(dāng)Bundle對(duì)象中包含“workspace.configuration.package.name”的時(shí)候蔗喂,回去獲取對(duì)應(yīng)的apk的resouces忘渔。?
接著繼續(xù)調(diào)用get()函數(shù):1.首先獲取是否含有如,default_layout_6x6_h5.xml(有g(shù)rid size和hotseat count拼接)缰儿;2.然后獲取是否有如畦粮,default_layout_6x6.xml(有g(shù)rid size拼接);3.最后獲取默認(rèn)的default_layout.xml?
B.第二種:從配置APK(與android.autoinstalls.config.action.PLAY_AUTO_INSTALL)讀xml?
這里調(diào)用AutoInstallsLayout中的get函數(shù)乖阵,最關(guān)鍵的實(shí)現(xiàn)函數(shù)是findSystemApk宣赔。根據(jù)特定的action:android.autoinstalls.config.action.PLAY_AUTO_INSTALL,來(lái)獲取是否system中有這發(fā)出的這個(gè)action的app瞪浸,若有則去獲取apk的packagename和resource儒将。?
接著繼續(xù)調(diào)用get()函數(shù):1.首先獲取是否含有如,default_layout_6x6_h5.xml(有g(shù)rid size和hotseat count拼接)对蒲;2.然后獲取是否有如钩蚊,default_layout_6x6.xml(有g(shù)rid size拼接);3.最后獲取默認(rèn)的default_layout.xml
大致流程圖如下:?
C.第三種:從一個(gè)preload特定名稱(com.android.launcher3.action.PARTNER_CUSTOMIZATION)的APK里面取得xml?
最關(guān)鍵的實(shí)現(xiàn)函數(shù)是findSystemApk蹈矮。根據(jù)特定的action:android.autoinstalls.config.action.PLAY_AUTO_INSTALL砰逻,來(lái)獲取是否system中有這發(fā)出的這個(gè)action的app,若有則去獲取apk的packagename和resource泛鸟。?
接著通過(guò)hasDefaultLayout()來(lái)判斷apk中是否有partner_default_layout.xml蝠咆,若有,則將此xml作為defaultlayout
這種情況可以參看google GMS中的一個(gè)GmsSampleIntegration 應(yīng)用谈况。?
a.看他的AndroidManifest.xml:
b.資源目錄中有partner_default_layout.xml勺美,其中有對(duì)布局的定義递胧。
D.第四種:從原生Launcher中讀取xml文件(這里根據(jù)桌面dimen去選取4*4 5*5 的xml文件)?
這里主要是從InvariantDeviceProfile類中獲取到對(duì)應(yīng)defaultLayoutId,然后通過(guò)DefaultLayoutParser類調(diào)到用其父類AutoInstallsLayout的構(gòu)造函數(shù)中進(jìn)行對(duì)xml文件的解析赡茸。
獲取默認(rèn)的defaultLayouId主要是在InvariantDeviceProfile中獲取的:在其構(gòu)造函數(shù)中調(diào)用到getPredefinedDeviceProfiles()缎脾,會(huì)從device_profiles.xml中選擇合適的,選擇的方法是獲取屏幕的width和height來(lái)匹配xml文件中的minWidthDps和minHeightDps占卧,挑選開(kāi)平方后值最相近的一個(gè)profiles遗菠。最終取到對(duì)應(yīng)的defaultLayouId(對(duì)應(yīng)default_workspace_3x3 、default_workspace_4x4等)?
InvariantDeviceProfile的各個(gè)參數(shù)依次代表:?
配置名字(任意定義)华蜒、最小寬度(單位是dp)辙纬、最小高度(單位是dp)、桌面行數(shù)叭喜、桌面列數(shù)贺拣、文件夾行數(shù)、文件夾列數(shù)捂蕴、主菜單中predicted apps最小列數(shù)譬涡、桌面Icon的size(單位是dp)、桌面Icon的文字size(單位是dp)啥辨、Hotseat的Icon個(gè)數(shù)涡匀、Hotseat的Icon的size(單位是dp)、默認(rèn)的桌面配置LayoutId溉知、demo apk的layuoutId陨瘩。
大致的流程圖如下:?
ps:xml文件中元素的x 、y的值最終在layout中的位置:若為正级乍,則即為x/y舌劳;若為負(fù),則為行/列數(shù)-y/x
首次加載的時(shí)候會(huì)走上面四種中的某一種卡者,最終這些會(huì)被加載到db文件中蒿囤,之后重啟等操作加載的就是直接從db中獲取出來(lái)的。
三.總結(jié)?
1.如果有需求需要客制化的workspace崇决,可以考慮在第四步中加入客制化的workspace.xml的加載實(shí)現(xiàn)即可材诽;?
2.Launcher 幾x幾的實(shí)現(xiàn)即在profiles中獲取的numRows和numColumns值來(lái)獲取恒傻;?
3.后續(xù)會(huì)專開(kāi)一篇大致講下xml的寫(xiě)法脸侥。
FAQ(后續(xù)補(bǔ)充):