日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

抖音字體大小設(shè)置方法安卓 抖音字體大小設(shè)置方法( 五 )


要實現(xiàn) Splash 與 Main 合并,我們需要解決的問題主要有 2 個:
合并后如何解決外部通過 Activity 名稱跳轉(zhuǎn)的問題;如果解決 LaunchMode 與多實例的問題 。
第 1 個問題比較容易解決,我們可以通過 activity-alias+targetActivity 將 SplashActivity 指向 MainActivity 解決 。接下來我們來看一下第二個問題 。

抖音字體大小設(shè)置方法安卓 抖音字體大小設(shè)置方法


launchMode 問題
在 Splash 與 Main 合并之前,SplashActivity 與 MainActivity 的 LaunchMode 分別是 standard 和 sinngletask,這種情況下我們能夠確保 MainActivity 只有一個 實例,并且在我們從應(yīng)用 home 出去再次進(jìn)入時,能夠重新回到之前的頁面 。
將 SplashActivity 與 MainActivity 合并以后,我們的 launcher Activity 變成了 MainActivity,如果繼續(xù)使用 singletask 這個 launchMode,當(dāng)我們從二級頁面 home 出去再次點擊 icon 進(jìn)入時,我們將無法回到二級頁面,而會回到 Main 頁面,因此合并后 MainActivity 的 launch mode 將不再能夠使用 singletask 。經(jīng)過調(diào)研,我們最終選擇了使用 singletop 作為我們的 launchMode 。
抖音字體大小設(shè)置方法安卓 抖音字體大小設(shè)置方法


多實例問題
1、內(nèi)部啟動多實例的問題
使用 singletop 雖然能夠解決 home 出去再次進(jìn)入無法回到之前頁面的問題,但是隨之而來的是 MainActivity 多實例的問題 。在抖音的邏輯中存在一些與 MainActivity 生命周期強(qiáng)關(guān)聯(lián)的邏輯,如果 MainActivity 存在多個實例,這部分邏輯將會受到影響,同時多個 MainActivity 的實現(xiàn),也會導(dǎo)致我們不必要的資源開銷,與預(yù)期是不符的,因此我們希望能夠解決這個問題 。
針對這個問題我們的解決方案是,對于應(yīng)用內(nèi)所有啟動 MainActivity 的 Intent 增加 FLAG_ACTIVITY_NEW_TASK 與 FLAG_ACTIVITY_CLEAR_TOP 的 flag,以實現(xiàn)類似于 singletask 的 clear top 的特性 。
使用 FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP 的方案,我們基本能夠解決內(nèi)部啟動 MainActivity 多實例的問題,但是實際測試過程中,我們發(fā)現(xiàn)在部分系統(tǒng)上,即使實現(xiàn)了 clear top 的特性,依然存在多實例的問題 。
經(jīng)過分析,我們發(fā)現(xiàn)在這部分系統(tǒng)上,即使通過 activity-alias+targetActivity 方式將 SplashActivity 指向了 MainActivity,但是在 AMS 側(cè)它仍然認(rèn)為啟動的是 SplashActivity,后續(xù)再啟動 MainActivity 時會認(rèn)為之前是不存在 MainActivity 的,因此會再次啟動一個 MainActivity 。
針對這個問題我們的解決方案是,修改啟動 MainActivity Intent 的 Component 信息,將其改從 MainActivity 改為 SplashActivity,這樣我們就徹底解決了內(nèi)部啟動 MainActivity 導(dǎo)致的多實例的問題 。
抖音字體大小設(shè)置方法安卓 抖音字體大小設(shè)置方法


為了盡可能少的侵入業(yè)務(wù),同時也防止后續(xù)迭代再出現(xiàn)內(nèi)部啟動導(dǎo)致 MainActivity 問題,我們對 Context startActivity 的調(diào)用進(jìn)行了插樁 。對于啟動 MainActivity 的調(diào)用,在完成向 Intent 中添加 flag 和替換 Component 信息后再調(diào)用原有實現(xiàn) 。之所以選擇插樁方式實現(xiàn),是因為抖音的代碼結(jié)構(gòu)比較復(fù)雜,存在多個基類 Activity,且部分基類 Activity 無法直接修改到代碼 。對于沒有這方面問題的業(yè)務(wù),可以通過重寫基類 Activtity 及 Application 的 startActivity 方法的方式實現(xiàn) 。
2、外部啟動多實例問題
以上解決 MainActivity 多實例的方案,是建立在啟動 Activity 之前去修改待啟動 Activity 的 Intent 的方式實現(xiàn)的,這種方式對于應(yīng)用外部啟動 MainActivity 導(dǎo)致的 MainActivity 多實例的問題顯然是無法解決的 。那么針對外部啟動 MainActivity 導(dǎo)致的多實例問題,我們是否有其他解決方案呢?

推薦閱讀