Android 跨进程启动Activity黑屏(白屏)的三种解决方案
2017-12-16 23:19
549 查看
当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?)。当然从桌面Lunacher启动一个App时也会出现相同情况,那是因为App冷启动也属于跨进程启动Activity。为什么没会出现这种情况呢?真正元凶就是Android创建进程需要准备很多资源,它是一个耗时的操作。
Android团队避免出现这种尴局面,于是系统根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个黑(白)屏被称作Preview Window,即预览窗口。
既然Android在创建进程启动新Activity时默认设置了Preview Window,那么我们也可以在主题中禁用该属性。
style.xml
分析:这样做可以解决部分场景的问题,比如在A进程启动B进程中的Activity;但是在另外一个场景就有问题了,在桌面Launcher点击应用出现短暂的假死现象。
2.自定义Preview Window
既然Android可以根据主题设置Preview Windo黑屏(白屏),那么我们也可以自定义一个Preview Window样式来代替黑(白)屏效果。
style.xml
分析:该解决方案很适合启动一个App场景,android:windowBackground属性设置Preview Window的背景,市面上大部分App都是使用该属性设置启动页背景。出于节省内存的考虑该背景图片适合使用效果简单的.9图片。
但是该解决方案不适合在跨进程启动Activity场景了。
3.设置Preview Window透明属性
我们可以设置Preview Window 为透明,也可以解决问题
style.xml
分析:该解决方案适合跨进程启动Activity场景使用。当然这个解决方案也会引入其他问题,就是:android:windowIsTranslucent 引起activity切换动画无效解决方案。为了追求极致,不能解决一个问题引入一个新问题,该问题的解决方案也有两种:
代码动态设置Activity专场动画
给Window 设置动画style
自此,跨进程启动Activity黑(白)屏的三种方案已给出,看官可以根据不同场景使用以上不同解决方案
扫码关注微信公众号“Android知识传播”,不定时传播常用Android基础知识。
黑屏(白屏)原因
当A进程启动B进程中的一个Activity时,Android系统会先有zygote进程创建B进程,然后才能启动这个Activity。但创建进程是耗时的,在创建完成之前,新的Activity界面还没机会展示,如此用户在跳转新的Activity时会短暂没反应,这极大的降低用户体验。Android团队避免出现这种尴局面,于是系统根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个黑(白)屏被称作Preview Window,即预览窗口。
解决方案
1.禁用Preview Window既然Android在创建进程启动新Activity时默认设置了Preview Window,那么我们也可以在主题中禁用该属性。
style.xml
<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:windowDisablePreview">true</item> </style>
分析:这样做可以解决部分场景的问题,比如在A进程启动B进程中的Activity;但是在另外一个场景就有问题了,在桌面Launcher点击应用出现短暂的假死现象。
2.自定义Preview Window
既然Android可以根据主题设置Preview Windo黑屏(白屏),那么我们也可以自定义一个Preview Window样式来代替黑(白)屏效果。
style.xml
<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:windowBackground">@drawable/splash_icon</item> <item name="android:windowFullscreen">true</item> <item name="android:windowNoTitle">true</item> </style>
分析:该解决方案很适合启动一个App场景,android:windowBackground属性设置Preview Window的背景,市面上大部分App都是使用该属性设置启动页背景。出于节省内存的考虑该背景图片适合使用效果简单的.9图片。
但是该解决方案不适合在跨进程启动Activity场景了。
3.设置Preview Window透明属性
我们可以设置Preview Window 为透明,也可以解决问题
style.xml
<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowFullscreen">true</item> <item name="android:windowNoTitle">true</item> </style>
分析:该解决方案适合跨进程启动Activity场景使用。当然这个解决方案也会引入其他问题,就是:android:windowIsTranslucent 引起activity切换动画无效解决方案。为了追求极致,不能解决一个问题引入一个新问题,该问题的解决方案也有两种:
代码动态设置Activity专场动画
overridePendingTransition(R.anim.anim_right_in,R.anim.anim_left_out);
给Window 设置动画style
<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowFullscreen">true</item> <item name="android:windowNoTitle">true</item> <item name="android:windowAnimationStyle">@styleAnimation.Activity.Translucent.Style/</item> </style> <style name="Animation.Activity.Translucent.Style" parent="@android:style/Animation.Translucent"> <item name="android:windowEnterAnimation">@anim/base_slide_right_in</item> <item name="android:windowExitAnimation">@anim/base_slide_right_out</item> </style>
自此,跨进程启动Activity黑(白)屏的三种方案已给出,看官可以根据不同场景使用以上不同解决方案
扫码关注微信公众号“Android知识传播”,不定时传播常用Android基础知识。
相关文章推荐
- 跨进程启动Activity黑屏(白屏)的三种解决方案
- Android 跨进程启动Activity黑屏(白屏)的解决方案【转】
- Android 启动APP时黑屏白屏的三个解决方案(转载)
- Android 启动APP时黑屏白屏的三个解决方案
- 【Android】app 启动 白屏 黑屏解决方案
- Android 启动APP时黑屏白屏的三个解决方案
- Android应用启动时屏幕黑屏或白屏解决方案
- Android APP启动时出现白屏或者黑屏解决方案
- 【置顶】Android启动页面有白屏(或者黑屏)过渡解决方案
- Android 启动APP时黑屏白屏的三个解决方案
- Android 启动APP时黑屏白屏的三个解决方案
- Android 启动APP时黑屏白屏的三个解决方案
- Android编程中activity启动时出现白屏、黑屏问题的解决方法
- Android 启动APP时黑屏白屏的三个解决方案
- Android 启动APP时黑屏白屏的三个解决方案
- android窗体动画:activity启动从底部向上滑动出现,关闭的时候从顶部向下滑动消失,并解决activity跳转的时候出现短暂的黑屏
- Android启动时去除白屏或黑屏
- android N进程启动流程(一)(捕获输入事件、准备创建activity、焦点切换)
- [Android]Splash界面解决启动白屏/黑屏问题
- Android应用启动前 白屏或者黑屏原因?