【技巧】ionic3優(yōu)雅解決啟動(dòng)前沉桌、后黑白屏問(wèn)題

這里只說(shuō)明androd和ios的情況谢鹊。

1、啟動(dòng)前黑白屏

啟動(dòng)前黑白屏問(wèn)題留凭,僅存在于android佃扼,是android應(yīng)用的通病,ionic表示這鍋它不背蔼夜。
具體操作時(shí)兼耀,當(dāng)我們點(diǎn)擊桌面圖標(biāo)啟動(dòng)APP時(shí),有時(shí)會(huì)閃一下黑色背景求冷,有時(shí)黑色背景時(shí)間還比較長(zhǎng)瘤运。原因是:

黑色背景:其實(shí)是在我們看到首頁(yè)第一幀之前,看到的默認(rèn)的背景色匠题,黑拯坟、白色對(duì)應(yīng)的就是黑白背景。

那解決方法是:讓這個(gè)黑色的背景變成用戶喜歡看到的畫面或者讓它透明化韭山。

所以解決方式有好幾種郁季,可以看這兩篇文章:
Android啟動(dòng)頁(yè)優(yōu)化,去黑屏實(shí)現(xiàn)秒啟動(dòng)
Android啟動(dòng)頁(yè)黑屏及最優(yōu)解決方案

具體應(yīng)用在ionic上可以參照這個(gè):
快速解決ionic安卓主題啟動(dòng)時(shí)短暫的黑屏或白屏問(wèn)題

然而個(gè)人建議不要直接操作platform里面的項(xiàng)目文件掠哥,因?yàn)楫?dāng)移除再添加android平臺(tái)時(shí)巩踏,復(fù)制修改很麻煩秃诵,而且容易遺忘续搀。

于是,我把上述方法改造一下菠净,改造前禁舷,我們了解下原理:

a. 創(chuàng)建一個(gè)主題,修改其背景為透明毅往,或者和啟動(dòng)屏圖片一致牵咙;
b. AndroidManifest.xml文件,把主題改為上述主題攀唯。

原理很簡(jiǎn)單洁桌,但實(shí)際操作起來(lái)需要調(diào)整,因?yàn)槟J(rèn)沒(méi)有主題文件styles.xml的侯嘀,我們需要?jiǎng)?chuàng)建另凌,具體改造步驟如下(下面的1谱轨、2步是為了實(shí)現(xiàn)上述a,3吠谢、4步是為了實(shí)現(xiàn)上述b):
1)創(chuàng)建styles.xml文件——注意:文件名固定不能變土童,因?yàn)槭莂ndroid特有文件名

<resources>
    <style name="WelcomeStyle" parent="@android:style/Theme.DeviceDefault.NoActionBar">
        <item name="android:windowBackground">@drawable/screen</item>
        <item name="android:windowNoTitle">true</item>
    </style>
    <style name="Appwelcome" parent="android:Theme.Translucent.NoTitleBar.Fullscreen">
    </style>
</resources>

原理是繼承一個(gè)主題,修改其背景工坊。我這里定義了兩個(gè)樣式献汗,來(lái)滿足不同喜好,使用時(shí)二選一就行了:第一個(gè)樣式王污,screen.png作為ionic或cordova默認(rèn)生成的啟動(dòng)屏圖片罢吃,于是使用screen.png為背景圖;第二個(gè)樣式為透明主題昭齐。

2)創(chuàng)建一個(gè)cordova插件刃麸,啥邏輯都沒(méi)有,只是利用配置把styles.xml復(fù)制到項(xiàng)目中——plugin.xml唯一重要配置:

  <source-file src="src/android/styles.xml" target-dir="res/values" />

我曾想通過(guò)配置的方式復(fù)制styles.xml文件司浪,但是沒(méi)有解決到泊业,所以還是選用插件方式;
關(guān)于自定義插件可以參考此文:自定義Cordova插件詳解啊易;

上述兩步的可以直接下載已放到github上的插件cordova-fix-blackscreen吁伺。

然后安裝該插件:

ionic cordova plugin add 本插件本地或遠(yuǎn)程路徑

驗(yàn)證一下,會(huì)發(fā)現(xiàn)在platform目錄android里的res/values里會(huì)多出styles.xml文件租谈。

3)安裝cordova-custom-config——用于修改啟動(dòng)頁(yè)Activity的主題樣式為上述的自定義樣式WelcomeStyleAppwelcome篮奄。

ionic cordova plugin add cordova-custom-config

這個(gè)插件和普通插件不同,并不會(huì)增加項(xiàng)目大小割去,它是注冊(cè)Cordova的鉤子窟却,利用Cordova命令修改自定義配置。這是一個(gè)很強(qiáng)大的插件呻逆,能滿足很多定制化的需求夸赫,建議有空時(shí)了解一下。

4)應(yīng)用項(xiàng)目的config.xml文件添加下面一句咖城,指定使用的主題(2選1)茬腿,這樣在cordova build時(shí),cordova-custom-config插件會(huì)執(zhí)行并修改這句里的文件參數(shù)宜雀。

<preference name="android-manifest/application/activity/@android:theme" value="@style/WelcomeStyle" />

或者

<preference name="android-manifest/application/activity/@android:theme" value="@style/Appwelcome" />

上述兩步切平,在cordova@6.4.0后變得更為簡(jiǎn)單,添加了config-fileedit-config兩個(gè)標(biāo)簽項(xiàng)辐董,連cordova-custom-config插件都不用安裝悴品,就可以修改AndroidManifest.xml文件,在此文Cordova@6.4.0以上靈活修改配置有描述。

這樣就大功告成了苔严!
我們可以驗(yàn)證一下菇存,執(zhí)行命令運(yùn)行看效果:

ionic run android

2、啟動(dòng)后黑白屏

ionic啟動(dòng)頁(yè)使用了cordova-plugin-splashscreen這個(gè)插件邦蜜,插件配置在應(yīng)用的config.xml可設(shè)置:

    <preference name="ShowSplashScreenSpinner" value="false" />
    <preference name="AutoHideSplashScreen" value="false" />
    <preference name="FadeSplashScreen" value="true" />
    <preference name="SplashScreenBackgroundColor" value="false" />
    <preference name="SplashScreenDelay" value="3000" />
    <preference name="SplashMaintainAspectRatio" value="true" />
    <preference name="FadeSplashScreenDuration" value="300" />
    <preference name="SplashShowOnlyFirstTime" value="false" />
    <preference name="SplashScreen" value="screen" />
    <preference name="SplashScreenDelay" value="3000" />

ShowSplashScreenSpinner——是否顯示啟動(dòng)屏轉(zhuǎn)圈圈那個(gè) Spinner依鸥;
AutoHideSplashScreen——是否自動(dòng)隱藏SplashScreen;
FadeSplashScreen——是否逐漸消失SplashScreen悼沈;
SplashScreenBackgroundColor——背景顏色贱迟;
SplashMaintainAspectRatio——如果值設(shè)置為 true,則圖像將不會(huì)伸展到適合屏幕絮供。如果設(shè)置為 false 衣吠,它將被拉伸;
FadeSplashScreenDuration——逐漸消失SplashScreen的動(dòng)畫時(shí)延壤靶;
SplashShowOnlyFirstTime——是否只第一次顯示缚俏;
SplashScreen——它是 platform / android / res / drawable - 文件夾中的圖像的名稱。Cordova默認(rèn)生成 screen.png 圖片;
SplashScreenDelay——SplashScreen顯示的延時(shí)時(shí)間

這Splashscreen插件其實(shí)是個(gè)dialog贮乳,默認(rèn)在配置的延時(shí)時(shí)間(SplashScreenDelay)顯示忧换,延時(shí)時(shí)間到就關(guān)閉,這樣就會(huì)出現(xiàn)一個(gè)bug:

延時(shí)時(shí)間短向拆,應(yīng)用資源未加載完成亚茬,在dialog關(guān)閉后到首頁(yè)顯示這段過(guò)程中就會(huì)顯示黑屏。就算使用--prod參數(shù)進(jìn)行AOT編譯能提高加載速度浓恳,但不同機(jī)子性能不同不能完全保證加載時(shí)間少于延時(shí)時(shí)間刹缝,問(wèn)題依然會(huì)存在。

解決的方法有:
1)設(shè)置較長(zhǎng)的延時(shí)時(shí)間(配置改SplashScreenDelay)颈将,用于超過(guò)應(yīng)用資源加載時(shí)間
這樣dialog一關(guān)閉就看到已加載完的首頁(yè)了梢夯,但是這種方式的缺點(diǎn)是:延時(shí)時(shí)間不可判,設(shè)長(zhǎng)了晴圾,給人感覺(jué)啟動(dòng)太慢颂砸,設(shè)短了,應(yīng)用還是沒(méi)有加載完疑务。

2)一直顯示沾凄,直到應(yīng)用加載完成后調(diào)用關(guān)閉
打開(kāi)config.xml,主要添加或修改下面語(yǔ)句即可:

<preference name="AutoHideSplashScreen" value="false" />

然后打開(kāi)app.component.ts知允,發(fā)現(xiàn)下面代碼,這里就是手動(dòng)關(guān)閉了叙谨,所以我們不需要改動(dòng)温鸽。

  constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
    platform.ready().then(() => {
      // Okay, so the platform is ready and our plugins are available.
      // Here you can do any higher level native things you might need.
      statusBar.styleDefault();
      splashScreen.hide();
    });
  }

3、其它情況

可能加了--prod參數(shù)后build出現(xiàn)的,先看命令行的輸出提示涤垫,若無(wú)有效信息姑尺,再網(wǎng)頁(yè)調(diào)試,若也沒(méi)錯(cuò)誤蝠猬,那就基本是原生插件問(wèn)題切蟋,進(jìn)行真機(jī)調(diào)試。加與不加這參數(shù)的區(qū)別其實(shí)是AOT(Ahead-of-time榆芦,提前編譯)和JIT(Just-in-time柄粹,即時(shí)編譯)的區(qū)別,使用參數(shù)后使用AOT匆绣,若代碼存在不規(guī)范的地方驻右,如缺文件使得應(yīng)用報(bào)錯(cuò)而無(wú)法啟動(dòng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崎淳,一起剝皮案震驚了整個(gè)濱河市堪夭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拣凹,老刑警劉巖森爽,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嚣镜,居然都是意外死亡拗秘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門祈惶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雕旨,“玉大人,你說(shuō)我怎么就攤上這事捧请》采” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵疹蛉,是天一觀的道長(zhǎng)活箕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)可款,這世上最難降的妖魔是什么育韩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮闺鲸,結(jié)果婚禮上筋讨,老公的妹妹穿的比我還像新娘。我一直安慰自己摸恍,他們只是感情好悉罕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赤屋。 她就那樣靜靜地躺著,像睡著了一般壁袄。 火紅的嫁衣襯著肌膚如雪类早。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天嗜逻,我揣著相機(jī)與錄音涩僻,去河邊找鬼。 笑死栈顷,一個(gè)胖子當(dāng)著我的面吹牛逆日,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妨蛹,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屏富,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蛙卤?” 一聲冷哼從身側(cè)響起狠半,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颤难,沒(méi)想到半個(gè)月后神年,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡行嗤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年已日,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栅屏。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飘千,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栈雳,到底是詐尸還是另有隱情护奈,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布哥纫,位于F島的核電站霉旗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛀骇。R本人自食惡果不足惜厌秒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擅憔。 院中可真熱鬧鸵闪,春花似錦、人聲如沸雕欺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屠列。三九已至啦逆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛洛,已是汗流浹背夏志。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苛让,地道東北人沟蔑。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狱杰,于是被迫代替她去往敵國(guó)和親瘦材。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容