当前位置: 首页 > 编程笔记 >

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

奚和光
2023-03-14
本文向大家介绍Android Splash界面白屏、黑屏问题的解决方法,包括了Android Splash界面白屏、黑屏问题的解决方法的使用技巧和注意事项,需要的朋友参考一下

前言

我相信很多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截屏SurfaceView黑屏问题的解决办法,包括了Android截屏SurfaceView黑屏问题的解决办法的使用技巧和注意事项,需要的朋友参考一下 最近项目中有截屏的需求,普通的view截屏方法网上一搜一大把,但是SurfaceView截屏黑屏问题很多文章说的并不清楚,自己参考了一些别的博客,再加上自己的思考,算是找到了一种解决方案。 1、首先看我们一般是怎么用Su

  • 本文向大家介绍Flutter Android端启动白屏问题的解决,包括了Flutter Android端启动白屏问题的解决的使用技巧和注意事项,需要的朋友参考一下 问题描述 Flutter 应用在 Android 端上启动时会有一段很明显的白屏现象,白屏的时长由设备的性能决定,设备性能越差,白屏时间越长。 问题分析 其实启动白屏的问题在Android原生应用上也是一个常见问题,大致是因为从用户点击

  • 我以前也发布过同样的问题,但我现在再次发布,因为我在代码中发现了更多的错误并更正了它们。然而,我仍然面临着和以前一样的问题! 原始帖子:我几周前刚开始学习Python,我正在学习一个教程,用pygame构建一个数独解算器! 我现在面临的问题是,每当我尝试运行代码时,只会弹出一个黑色的空白窗口。我已经一遍又一遍地检查我的代码,但我似乎找不到问题。。。我不确定我的代码中到底是哪里出了问题,所以请原谅我

  • flutter中的AlertDialog有一个奇怪的问题来取消对话框。我使用下面的代码片段来关闭flutter文档中提到的对话框。 但显示它是如何工作的,使应用程序进入非活动模式,并变成黑屏窗口。要让它再次工作,我必须干掉这个应用程序,然后重新启动。 下面是flutter中alertdialog的完整代码 我还注意到它适用于一个按钮“Call”,没有任何问题,但不适用于取消警报对话框,正如您在两个

  • 问题背景 使用vue3+vite写了一个内置于一个app里面的小程序,打包上线后Android一切正常,ios打开后发现白屏,经排查后发现,iOS版本15.3.1能打开,17.1.1不能打开,17.1.2能打开但是加载不出来阿里巴巴矢量库引入的图标,但是他又没报错,目前个人觉得是ios版本兼容问题,但是又不太清楚,有高手看看? 尝试过使用@vitejs/plugin-legacy插件

  • 这是我的代码,请记住,我在几天前学习了python,所以我的代码可能制作不正确,等等。我正在尝试制作一个窗口,该窗口将显示一些文本(测试版),并将显示两个小矩形,我想成为按钮。