【第22期】观点:IT 行业加班,到底有没有价值?

Android Splash界面解决白屏、黑屏等问题

原创 2016年08月30日 17:16:36

前言

我相信很多Android开发同学都遇到过这样的需求:

  1. 实现一个Splash界面,界面上有应用相关的背景图片和一个开始按钮.
  2. 点击按钮之后进入主页,以后用户再打开应用就不显示这个Splash界面了.

也相信很多同学都遇到了这样的困惑:

  • 第二次进入应用,尽管你在Splash界面已经直接跳转到首页了,但是还是有个白屏或者黑屏或者带ActionBar的白屏闪现一下.

如果你也遇到这个问题,那就继续阅读这篇文章,我带大家去分析和解决这个问题.


解决方案

这里我们先给出解决方案,然后再具体分析产生原因哈.避免分析的大段文字阻碍了同学学习的热情.

解决方案非常简单,一句话概括是:给Splash Activity设置一个主题,主题内容是:全屏+透明.

style.xml增加SplashTheme主题:

<style name="SplashTheme" parent="AppTheme">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

AndroidManifest.xml中为SplashActivity配置主题:

<activity android:name=".activity.SplashActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

经过如上配置,困扰你的白屏、黑屏、ActionBar屏应该都已经烟消云散了.为了知其然,并知其所以然,希望同学能继续跟我一起分析一下这些白屏产生的原因.


Activity组件的窗口启动过程

首先声明,本段内容大量参考了罗升阳老师的博客。为了方便理解,对其内容进行了压缩。如果侵权,我立刻删掉这段分析哈。

想要了解白屏产生的根源,就不得不去跟踪Activity组件的窗口启动过程。Activity组件在启动的过程中,会调用ActivityStack类的成语函数startActivityLocked方法。注意,在调用ActivityStack类的成语函数startActivityLocked方法的时候,Activity组件还处于启动过程中,即它的窗口尚未显示出来,不过这时候ActivityManagerService服务会检查是否需要为正在启动的Activity组件显示一个启动窗口。如果需要的话,那么ActivityManagerService服务就会请求WindowManagerService服务为正在启动的Activity组件设置一个启动窗口(ps:而这个启动窗口就是白屏的由来)。


1. ActivityStack.startActivityLocked

public class ActivityStack {
    // set to false to disable the preview that is shown while a new activity
    // is being started.
    static final boolean SHOW_APP_STARTING_PREVIEW = true;

    private final void startActivityLocked(ActivityRecord r, boolean newTask, boolean doResume) {
        final int NH = mHistory.size();

        int addPos = -1;

        // Place to new activity at top of stack, so it is next to interact
        // with the user.
        if (addPos < 0) {
            addPos = NH;
        }

        // Slot the activity into the history stack and proceed
        mHistory.add(addPos, r);

        if (NH > 0) {
            // We want to show the starting preview window if we are
            // switching to a new task, or the next activity's process is
            // not currently running.
            boolean showStartingIcon = newTasks;
            ProcessRecord proc = r.app;
            if (proc == null) {
                proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);
            }
            if (proc == null || proc.thread == null) {
                showStartingIcon = true;
            }


        }
    }
}

未完待续…

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

关于Android主题splash全屏和主页面的沉浸式状态栏

最近做项目需要经常修改Android主题,对于每个Activity都进行自定义主题设置,下面讲一下对于主题的一些使用心得。 1. 全屏显示activity 由于studio中继承AppCompa...

Android 创建android Splash界面以及避免app闪屏现象

参考: 创建Android启动界面:http://www.cnblogs.com/xiongbo/archive/2011/05/17/splash.html android颜色color...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

android AppCompat, splash启动白屏(黑屏)全屏,去掉状态栏,以及splash与虚拟按键遮挡

在做项目是,需要加一个splash,以美化应用,消除app启动等待的乏味、 一、使用环境 AppCompatActivity 二、目标与一般实现 一般是新建一个activity,但是有黑屏 三、实现启...

Android Splash界面支持用户点击 直接进入主界面

现在大部分APP都有Splashjie'mian

Android应用中,去掉Activity标题栏以及状态栏

这里就说最好的方式吧,修改AndroidManifest.xml配置文件如果想要全局去掉标题栏以及状态栏则将以下代码写在application节点中@android:style/Theme.NoTit...

去除unity3d的splash页面(remove unity3d splash image),在android中。

本博客如需转载,请注明出处

Android开发App状态栏隐藏和显示及颜色控制处理

在我们开发android app时会经常会遇到控制设备状态栏两种情况, 第一种情况是状态栏的隐藏,例如在首次 引导或闪屏广告时我们不希望显示,希望引导页和闪屏广告布 满整屏来显示,这里只给出关键代...

Android性能优化之Splash页面设计

目前SplashActivity的设计目前市场上的应用在启动时基本上都会先启动一个SplashActivity,作为一个欢迎界面,为什么这样设计呢? 个人总结有三个优点:1、可以给用户更好的体验比...

详解Android中App的启动界面Splash的编写方法

一、Splash界面的作用 用来展现产品的Logo 应用程序初始化的操作 检查应用程序的版本 检查当前应用程序是否合法注册 二、界面的xml定义 写一个布局背景设置为产品的logo图片...

android应用程序第一次启动时显示引导界面

市面上好多优秀的应用(举例新浪微博、UC浏览器)都采用了欢迎页面与使用向导的方式给用户带来了良好的用户体验。 一般来说用户第一次安装应用或者安装了新版本后第一次进入应用都会显示成 欢迎页面-使用...
  • kuanxu
  • kuanxu
  • 2014-10-11 15:50
  • 18574
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)