android - 安卓应用冷启动如何避免开机白屏?
黄舟
黄舟 2017-04-18 09:16:42
0
5
728

我一直以为只要在 application的theme下设置background就好了,(同类型解决方法还有设置为透明)
但是今天在实际测试中发现,
在oppo m37a 上是有效果的(api 22)
但是在红米4 上发现是没有效果的!(api23)

我尝试打开红米4上多款应用发现:

  • 瞬间打开且没有白屏

    1. 高德地图

    2. 掘金

    3. segmentfault

    4. 手机淘宝

    5. 印象笔记

    6. 等。。。

  • 有白屏

    1. 知乎日报

    2. 扇贝单词

    3. 人民日报

    4. 摩拜单车

  • 没有白屏,但是点击icon 会延迟一会才打开

    1. 简书

    2. UC浏览器

    3. 支付宝

    如果是白屏或者是“延迟打开”,我觉得可以办到

那要怎样才能做到segmentfault ,手机淘宝这样呢?

启动第一个activity,这个activity 只是为了作为背景显示,把一些初始化的工作放到第2个activity中?
这样的话做法好奇怪啊?应该有什么更直接的方案吧?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(5)
巴扎黑

要設background也应该是windowBackground,不需要2個activity來實現,如果到這種地步,很有可能你的application或mainactivity做了太多主執行緒工作了。

左手右手慢动作

把啟動設定為透明,在主題檔案中加入以下程式碼

<item name="android:windowDisablePreview">true</item>
PHPzhong

    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

設定主題 然後在這裡引用即可

        android:name=".Activity.LoadingActivity"
        android:theme="@style/welcomeTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    

巴扎黑

若是在application中所做工作過多的話,我倒是有一個簡單的方法,可以透過多進程方式按進程啟動,次進程負責主進程啟動初始化時啟動一個屏保界面,當主進程完成初始化發送給次進程退出,主進程介面啟動,這樣就避免application初始化過大導致首次啟動過慢的問題。

左手右手慢动作

先理清為什麼白屏, 然後根據自己業務代碼修改.
當桌面圖標被點擊後, 會打開App的第一個Activity.在Activity被創建前可能還有Application會被創建, 知道Activity的onResume執行後才真正看到第一個頁面.在此之前,可以理解為就是白屏時間(使用黑科技修改theme不考慮).所以減少白屏,就是減少這幾個流程所消耗的時間,簡單粗暴的方法就是把這些依賴套件的初始化都放到Splash頁面onResume後執行
好懶,不想打字...
實際上遇到各種問題,都需要自己解決.比如初始化只需要幾百毫秒,Splash太快跳轉了,可以加多一點實際判斷.比如沒有Splash頁面,可以把初始化放到首頁,初始化完再執行其他操作.再比如重複初始化,可以添加一個static變量標記是否已初始化.
總結就是找到哪些地方佔據了第一個Activity的onResume之前的時間,針對優化(還可能是圖片解析,佈局渲染...)

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板