国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Splash界面白屏、黑屏問題的解決方法

2019-12-12 05:16:05
字體:
來源:轉載
供稿:網友

前言

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

未完待續…希望大家繼續關注。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝阳县| 克山县| 丰县| 绍兴市| 淅川县| 林芝县| 微山县| 石河子市| 遂宁市| 神木县| 凯里市| 酉阳| 台中县| 云浮市| 韶山市| 珠海市| 遂平县| 南昌市| 集安市| 岳西县| 中宁县| 威远县| 鹤庆县| 明水县| 荣昌县| 离岛区| 塔河县| 满洲里市| 凌海市| 苏州市| 收藏| 泸定县| 西峡县| 深水埗区| 栖霞市| 湄潭县| 黄浦区| 当雄县| 惠州市| 宁陵县| 静海县|