原文链接: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黑屏(白屏)的三种解决方案的更多相关文章

  1. android 25 跨进程启动activity

    跨进程启动activity,启动系统预定义的activity就是跨进程的. client项目启动server项目的activity. clientActivity.java package com.s ...

  2. 通过action 跨进程启动activity

    在一些场景中我们需要从一个进程启动另外的一个应用的activity,这有什么好办法? 这里介绍一种方法,通过自定义 action 通过filter来启动. 如果你需要启动一个你自己写的另一个app的a ...

  3. Android 启动APP时黑屏白屏的三个解决方案

    你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...

  4. Android 启动APP时黑屏白屏的三个解决方案(转载)

    你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...

  5. Android跨进程通信访问其他应用程序的Activity

    访问其他应用程序的ActivityActivity既可以在进程内(同一个应用程序)访问,也可以跨进程访问.如果想在同一个应用程序中访问Activity,需要指定Context对象和Activity的C ...

  6. Android跨进程通信的四种方式

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  7. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  8. android 跨进程通信

    转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...

  9. android解析XML总结(SAX、Pull、Dom三种方式) <转载>

    android解析XML总结(SAX.Pull.Dom三种方式) http://www.cnblogs.com/JerryWang1991/archive/2012/02/24/2365507.htm ...

随机推荐

  1. Struts2实现文件上传下载功能(批量上传)

    今天来发布一个使用Struts2上传下载的项目, struts2为文件上传下载提供了好的实现机制, 首先,可以先看一下我的项目截图 关于需要使用的jar包,需要用到commons-fileupload ...

  2. sudo使用详细讲解

    1.原因:让普通用户具有root用户的权限通过sudo执行的命令都会存在日志里面2.用法1.sudo -l 列出当前用户有哪些sudo权限 2.visudo -c 检查语法是否错误 3.visudo ...

  3. Sqoop的安装部署

    在root的用户下 1):前提 安装JDK环境 2):前提 安装Hadoop和Hive客户端环境,如果需要导出到HBase则需要安装HBase客户端 3):下载sqoop : 命令: wget htt ...

  4. 【持续更新】JavaScript常见面试题整理

    [重点提前说]这篇博客里的问题涉及到了了JS中常见的的基础知识点,也是面试中常见的一些问题,建议初入职场的园友Mark收藏,本文会持续更新~ 1. 引入JS的三种方式 1.在HTML标签中直接使用,直 ...

  5. js规范

    js规范 Array 和 Object 直接量 为了避免这些歧义, 我们应该使用更易读的直接量来声明. var a = [x1, x2, x3]; var a2 = [x1, x2]; var a3 ...

  6. C#数据类型和SQL数据类型对照

    C#操作SQL Float类型,数据会多很多小数,原来是C#的float和sql的float类型不一致        /// <summary>        /// 数据库中与C#中的数 ...

  7. git打包

    git help tag #tag的用法git taggit tag -d xxx #删除taggit tag v1.1 #新增taggit describe --tag #  

  8. 熊掌号:"搜索+信息流"双引擎与"百家号+熊掌号"双品牌内容平台

    一. 熊掌号是什么?熊掌号简单来说,就是"搜索 + 信息流"双引擎与"百家号 + 熊掌号"双品牌内容平台,上线了,对站长还是企业,都是一件好事.只要写出优质的原 ...

  9. org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 6; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标。

      Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error ...

  10. shell脚本 expect 实现自动登陆

    vi auto_ssh.exp #!/usr/bin/expect   set ipaddress "123.227.159.159" set passwd "你的密码& ...