原文链接: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. Github和Github for windows的使用简介

    很多程序员都把自己开发的代码放到Github上,方便自己管理也有利于别人查阅.所以这两天我也捣鼓了一下这个东西,现在把怎么使用Github和Github for windows简单的总结一下. 1.现 ...

  2. AngularJS学习篇(二十四)

    AngularJS 应用 <html ng-app="myNoteApp"> <head> <meta charset="utf-8&quo ...

  3. 单元测试 Qunit

    http://api.qunitjs.com/category/assert/    测试方法   选中 "Check for Globals" 会暴露全局对象,看你的代码会不会无 ...

  4. Linux上MySQL的安装

    a.检测是否安装了mysql rpm  -qa | grep mysql b.卸载系统自带的mysql rpm -e --nodeps 卸载的包 rpm -e --nodeps mysql-libs- ...

  5. c++ const全局对象是如何处理的

    我主要是记录一个发现,目前我不能解释,先作个记录. const 只是一个 语义约束,由编译器强制实施的.使被约束的对象不能被直接访问修改. 我用 『直接』这词,因为在代码段中 ,用一个const 指针 ...

  6. [转载] 谷歌技术"三宝"之谷歌文件系统

    转载自http://blog.csdn.net/opennaive/article/details/7483523 题记:初学分布式文件系统,写篇博客加深点印象.GFS的特点是使用一堆廉价的商用计算机 ...

  7. select * from 的一些心得

    如何简单运用好 select * from语句,在不同的函数下,有不同的先后顺序. 语法格式 (代表先后顺便) (2)select 字段名 查询什么东西 (1)from 表名,从哪个表查询 例如:查询 ...

  8. (11.20)Java小知识!

      经过一段时间的学习,我也终于来到了Java语言的核心篇,也就是对象与类的学习,今天想要和大家分享的是关于类的小知识点. 1.类的声明: 类可以看成创建Java对象的模板.类亦可以理解成Java一种 ...

  9. MXNet之ps-lite及parameter server原理

    MXNet之ps-lite及parameter server原理 ps-lite框架是DMLC组自行实现的parameter server通信框架,是DMLC其他项目的核心,例如其深度学习框架MXNE ...

  10. 发现大量的TIME_WAIT解决办法 -- 修改内核参数

    今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库 服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%, ...