編輯:關於Android編程
前言
我相信很多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; } } } }
未完待續…希望大家繼續關注。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
一、背景最近做項目需要用到選擇圖片上傳,類似於微信、微博那樣的圖片選擇器,ContentResolver讀取本地圖片資源並用RecyclerView+Glide加載圖片顯
時不時的我們就會發現,一些我們常見的應用,比如某寶,某東,在一些特殊的日子中,比如雙十一,元旦,為了迎合這樣一個日子的氣氛,在桌面的應用圖標就會發生改變,其實對於這樣的一
前言Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android開源組件加載網絡圖片比較。在An
前言最近遇到一個項目的應用要上微信登錄,大家都知道微信登錄是需要開放平台上申請的,在微信開發平台創建移動應用後,需要填寫:需要填寫的內容問題這裡的應用簽名是keystor