当前位置: 移动技术网 > 移动技术>移动开发>Android > Android Splash界面白屏、黑屏问题的解决方法

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

前言

我相信很多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;
   }


  }
 }
}

未完待续…希望大家继续关注。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网