我一直以为只要在 application的theme下设置background就好了,(同类型解决方法还有设置为透明)
但是今天在实际测试中发现,
在oppo m37a 上是有效果的(api 22)
但是在红米4 上发现是没有效果的!(api23)
我尝试打开红米4上多款应用发现:
瞬间打开且没有白屏
高德地图
掘金
segmentfault
手机淘宝
印象笔记
等。。。
有白屏
知乎日报
扇贝单词
人民日报
摩拜单车
没有白屏,但是点击icon 会延迟一会才打开
简书
UC浏览器
支付宝
如果是白屏或者是“延迟打开”,我觉得可以办到
那要怎样才能做到segmentfault ,手机淘宝这样呢?
启动第一个activity,这个activity 只是为了作为背景显示,把一些初始化的工作放到第2个activity中?
这样的话做法好奇怪啊?应该有什么更直接的方案吧?
巴扎黑2017-04-18 09:18:42
要设background
也应该是windowBackground
,不需要2个activity来实现,如果到这种地步,很有可能你的application或mainactivity做了太多主线程工作了。
ringa_lee2017-04-18 09:18:42
把启动设置为透明,在主题文件中添加如下代码
<item name="android:windowDisablePreview">true</item>
PHPz2017-04-18 09:18:42
<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>
巴扎黑2017-04-18 09:18:42
若是在application中所做工作过多的话,我倒是有一个简单的方法,可以通过多进程方式按进程启动,次进程负责主进程启动初始化时启动一个屏保界面,当主进程完成初始化发送给次进程退出,主进程界面启动,这样就避免application初始化过大导致首次启动过慢的问题。
ringa_lee2017-04-18 09:18:42
先理清为什么白屏, 然后根据自己业务代码修改.
当桌面图标被点击后, 会打开App的第一个Activity.在Activity被创建前可能还有Application会被创建, 知道Activity的onResume执行后才真正看到第一个页面.在此之前,可以理解为就是白屏时间(使用黑科技修改theme不考虑).所以减少白屏,就是减少这几个流程所消耗的时间,简单粗暴的方法就是把这些依赖包的初始化都放到Splash页面onResume后执行
好懒,不想打字...
实际上遇到各种问题,都需要自己解决.比如初始化只需要几百毫秒,Splash太快跳转了,可以加多一点实际判断.比如没有Splash页面,可以把初始化放到首页,初始化完再执行其他操作.再比如重复初始化,可以添加一个static变量标记是否已初始化.
总结就是找到哪些地方占据了第一个Activity的onResume之前的时间,针对优化(还可能是图片解析,布局渲染...)