Android 跨进程启动Activity黑屏(白屏)的三种解决方案
原文链接:http://www.cnblogs.com/feidu/p/8057012.html
当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?)。当然从桌面Lunacher启动一个App时也会出现相同情况,那是因为App冷启动也属于跨进程启动Activity。为什么没会出现这种情况呢?真正元凶就是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基础知识。
Android 跨进程启动Activity黑屏(白屏)的三种解决方案的更多相关文章
- android 25   跨进程启动activity
		跨进程启动activity,启动系统预定义的activity就是跨进程的. client项目启动server项目的activity. clientActivity.java package com.s ... 
- 通过action 跨进程启动activity
		在一些场景中我们需要从一个进程启动另外的一个应用的activity,这有什么好办法? 这里介绍一种方法,通过自定义 action 通过filter来启动. 如果你需要启动一个你自己写的另一个app的a ... 
- Android 启动APP时黑屏白屏的三个解决方案
		你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ... 
- Android 启动APP时黑屏白屏的三个解决方案(转载)
		你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ... 
- Android跨进程通信访问其他应用程序的Activity
		访问其他应用程序的ActivityActivity既可以在进程内(同一个应用程序)访问,也可以跨进程访问.如果想在同一个应用程序中访问Activity,需要指定Context对象和Activity的C ... 
- Android跨进程通信的四种方式
		由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ... 
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
		前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ... 
- android 跨进程通信
		转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ... 
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
		android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ... 
随机推荐
- Linux双网卡绑定实现负载均衡
			系统环境:CentOS release 6.9 (Final) Linux centos6 2.6.32-696.10.1.el6.x86_64 Ubuntu系统下使用ifenslave进行网卡配置, ... 
- 从零开始搭建Vue组件库 VV-UI
			前言: 前端组件化是当今热议的话题之一,也是我们在开发单页应用经常会碰到的一个问题,现在我们有了功能非常完善的Element-UI.各个大厂也相继宣布开源XXX-UI.但是也会存在一些问题,比如每个公 ... 
- css伪类的说明以及使用(css事件)
			CSS伪类的使用(css事件) 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7670959.html 之前有开发开发App的时候,有同事问我那个列表的条目按下 ... 
- ANDROID基础ACTIVITY篇之Activity的加载模式
			在这之前首先让我们先了解一下什么是Task Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合.它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的A ... 
- python进阶------进程线程(三)
			python中的进程 1.multiprocessing模块 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进 ... 
- [O]ORACLE物化视图的使用
			用于数据复制的物化视图 物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制.而物化视图复制就是利用了物化视图的功能. 物化视图复制包含只读物化 ... 
- 准备冲锋 golang入坑系列
			史前摘要: 本来想写读前必读,但连续几篇博文都写读前必读,感觉就没有了新意. 所以换成史前摘要,反正是一个意思. 此摘要的目的仍然是提醒点击而来的同学,本系列最新文章在这里.放到博客园的目的是为了方便 ... 
- 转载:一位资深程序员大牛给予Java初学者的学习路线建议
			一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打 ... 
- Celery 源码解析七:Worker 之间的交互
			前面对于 Celery 的分布式处理已经做了一些介绍,例如第五章的 远程控制 和第六章的 Event机制,但是,我认为这些分布式都比较简单,并没有体现出多实例之间的协同作用,所以,今天就来点更加复杂的 ... 
- 解决:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'requestMap.maintenancename != null and requestMap.maintenance
			异常如下:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.Builde ... 
