android - 安卓应用冷启动如何避免开机白屏?

浏览:45日期:2022-11-05

问题描述

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

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

瞬间打开且没有白屏

高德地图

掘金

segmentfault

手机淘宝

印象笔记

等。。。

有白屏

知乎日报

扇贝单词

人民日报

摩拜单车

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

简书

UC浏览器

支付宝

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

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

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

问题解答

回答1:

要设background也应该是windowBackground,不需要2个activity来实现,如果到这种地步,很有可能你的application或mainactivity做了太多主线程工作了。

回答2:

把启动设置为透明,在主题文件中添加如下代码

<item name='android:windowDisablePreview'>true</item>回答3:

<style name='welcomeTheme' parent='AppTheme'>

<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>

设置主题 然后在这里引用即可 <activity

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> 回答4:

若是在application中所做工作过多的话,我倒是有一个简单的方法,可以通过多进程方式按进程启动,次进程负责主进程启动初始化时启动一个屏保界面,当主进程完成初始化发送给次进程退出,主进程界面启动,这样就避免application初始化过大导致首次启动过慢的问题。

回答5:

先理清为什么白屏, 然后根据自己业务代码修改.当桌面图标被点击后, 会打开App的第一个Activity.在Activity被创建前可能还有Application会被创建, 知道Activity的onResume执行后才真正看到第一个页面.在此之前,可以理解为就是白屏时间(使用黑科技修改theme不考虑).所以减少白屏,就是减少这几个流程所消耗的时间,简单粗暴的方法就是把这些依赖包的初始化都放到Splash页面onResume后执行好懒,不想打字...实际上遇到各种问题,都需要自己解决.比如初始化只需要几百毫秒,Splash太快跳转了,可以加多一点实际判断.比如没有Splash页面,可以把初始化放到首页,初始化完再执行其他操作.再比如重复初始化,可以添加一个static变量标记是否已初始化.总结就是找到哪些地方占据了第一个Activity的onResume之前的时间,针对优化(还可能是图片解析,布局渲染...)

相关文章: