天天看點

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

前言

關于 splash 頁面相信每個Android開發者都是非常熟悉的,而且很多人也遇到過需要在splash加個廣告圖檔,然後延遲3秒在進入首頁面,splash 應該隻是一個啟動頁面,不應該放廣告,但是那又能怎麼樣呢?又敵不過産品經理。

大多數情況下都會碰到啟動白屏和黑屏的情況,那麼本文将探讨幾種我在開發中用到的幾種解決方案。

原了解析

冷啟動

什麼是冷啟動

Android中的冷啟動,使用直白的話就是:

  • 當手機 重新開機 ,點選桌面圖示啟動應用的過程就是冷啟動
  • 未啟動手機,長時 未使用,應用被 kill 後,此時點選桌面圖示啟動應用的過程

冷啟動的表現形式

未做處理的情況

  • 點選桌面圖示後沒有反應,沒有瞬間打開應用,也就是沒有馬上看到應用打開
  • 點選桌面圖示後會顯示 黑屏 或者 白屏 , 沒有及時渲染出頁面元素

詳情可以檢視下圖:

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

冷啟動場景示範

從上圖可以看出,點選圖示後出現了短暫的白屏,然後才顯示了 splash 頁面的内容,在splash頁面進行了延遲 1500毫秒再跳轉到首頁面。雖然白屏的時間很短暫,但給使用者的體驗感就不是很好了。

冷啟動産生的原因

冷啟動産生的主要原因要從APP的啟動流程說起:

  1. 使用者點選 icon
  2. 系統開始加載和啟動應用
  3. 應用啟動:開啟空白(黑色)視窗
  4. 建立應用程序
  5. 初始化Application
  6. 啟動 UI 線程
  7. 建立第一個 Activity
  8. 解析(Inflater)和加載内容視圖
  9. 布局(Layout)
  10. 繪制(Draw)

下圖是啟動的日志資訊:

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

APP啟動日志資訊

從上面可以看出,從應用啟動到布局和繪制,是需要時間的,這也是無法避免的,越是低端的手機上,這一過程耗費的時間。

解決方案

首先要明确的一點就是:冷啟動無法避免,我們隻能去減少冷啟動的時間和适配冷啟動。

如何減少冷啟動的時間?

其實這個問題等同于如何減少應用初始化的時間,從上面的APP啟動流程中,如果我們在應用初始化的操作越多,那麼從初始化到繪制的時間越長,使用者看到真實界面的時間也就越長,可以從如下幾個方面進行:

  1. 減少在 Application 中的耗時操作(懶加載)
  2. 減少在 onCreate 的耗時操作

如何适配冷啟動?

Android 為我們提供了 android:windowBackground 的解決方案,我們可以專門為 SplashActivity 設定一個背景來避免 建立空白(黑色) 視窗這一步驟的尴尬,而對于 android:windowBackground 又延伸了各種各樣的方案。

1. 純色背景 + 啟動圖示

這種做法在國産APP上面少見,在國外的APP常見,簡單的來說就是用 layer-list 繪制一個純色的背景加上一個啟動圖示,layer-list 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/colorPrimary" />

    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher" />
    </item>

</layer-list>
           

然後我們為SplashActivity建立一個主題:

<resources>
    <!-- 基本主題 -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <!--純色加啟動圖示的方案-->
    <style name="SplashThemeLayer" parent="AppTheme">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowBackground">@drawable/bg_splash_layer_list</item>
    </style>
</resources>
           

最後為 SplashActivity設定主題為 SplashThemeLayer 在啟動看看效果吧。

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

冷啟動解決方案-純色背景加啟動圖示

是不是實作了想要的效果?點選應用圖示立即顯示了我們的圖示。

關于layer-list我們還可以拓展一下:例如加一個45°的線性漸變.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle">
            <gradient
                android:angle="45"
                android:endColor="@color/colorPrimary"
                android:startColor="@color/colorAccent" />
        </shape>

    </item>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher" />
    </item>

</layer-list>
           

看看效果:

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

純色拓展

實作是有點醜,但是哪有怎麼樣呢?

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

image

2. 使用背景圖檔

前面的第一種方式是使用純色背景 + 啟動圖示,這種方式肯定是不滿足我們的産品經理的,他們要的是 個性化 的頁面。

使用背景圖檔也是很簡單的,隻需要在them将我們之前的drawable替換成我們的圖檔即可:

<!--使用圖檔的方案-->
    <style name="SplashThemeImage" parent="AppTheme">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowBackground">@mipmap/icon_splish</item>
        <!--沉浸-->
        <item name="android:windowTranslucentStatus">true</item>
    </style>
           

需要注意的是:Splash頁面的背景顔色需要設定為透明 #00000000,不要設定其他背景,否則會導緻圖檔的伸縮變形。

看看啟動效果吧:

![

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

圖檔啟動完整方案

從效果圖可以看到,已經得到了我們平常想要的效果了,但是用這種方式又帶了了另外一個問題:

圖檔的記憶體占用和OOM,像這種啟動頁面的,基本上都是直接打包在APP中的,而色彩越是豐富,圖檔的體積就越大,大多數情況下我們是無法反駁的,我們可以通過壓縮圖檔的方式來盡量減少圖檔的體積,這裡推薦一個png壓縮網站:

tinypng

,基本上能把我們拿到的設計圖減少一半以上的體積。

3. 說服産品,使用更酷炫的方式來實作吧!

你可以這樣:

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

center

還可以這樣:

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

p

由于這不是我做的,是以就不放源碼了,自己去原作者哪裡看吧

onboarding-examples-android

題外:關于熱啟動

什麼是熱啟動

  • 使用者按下 Home 鍵傳回桌面後又馬上點選桌面圖示啟動應用(Application 仍然存活)
  • 應用未完全被殺死,從 啟動清單 中進入到應用(Application 仍然存活)

熱啟動表現形式

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

熱啟動表現顯示

從圖中我們示範了三種操作:

  • 點選 Home 鍵傳回桌面,點選icon進入應用
  • 點選 Home 鍵傳回桌面,從任務清單進入應用
  • 點選回退鍵退出應用,點選icon進入應用

以上三個操作都是十分的流暢,沒有絲毫的延遲,沒有出現白屏和黑屏的情況。

最後

總結

關于如何進行冷啟動的适配,三種方式,就看個人如何去抉擇了。解決問題的方式有很多,實在不行就解決提出問題的人吧,從根源上解決問題所在。

Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

無所畏懼

源碼位址

未完待續、敬請期待!

我的部落格位址
Android之路 - 冷啟動解決方案:實作秒開前言原了解析解決方案題外:關于熱啟動最後

FullScreenDeveloper

繼續閱讀