广告
返回顶部
首页 > 资讯 > 移动开发 >Android Splash界面白屏、黑屏问题的解决方法
  • 521
分享到

Android Splash界面白屏、黑屏问题的解决方法

方法Android 2022-06-06 07:06:01 521人浏览 薄情痞子
摘要

前言 我相信很多Android开发同学都遇到过这样的需求:  1.实现一个Splash界面,界面上有应用相关的背景图片和一个开始按钮.  2.点击按钮之后

前言

我相信很多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界面下详解及实例


--结束END--

本文标题: Android Splash界面白屏、黑屏问题的解决方法

本文链接: https://www.lsjlt.com/news/23922.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作