Android Splash界面白屏、黑屏問題的解決方法
前言
我相信很多Android開發(fā)同學(xué)都遇到過這樣的需求:
1.實現(xiàn)一個Splash界面,界面上有應(yīng)用相關(guān)的背景圖片和一個開始按鈕.
2.點擊按鈕之后進入主頁,以后用戶再打開應(yīng)用就不顯示這個Splash界面了.
也相信很多同學(xué)都遇到了這樣的困惑:
•第二次進入應(yīng)用,盡管你在Splash界面已經(jīng)直接跳轉(zhuǎn)到首頁了,但是還是有個白屏或者黑屏或者帶ActionBar的白屏閃現(xiàn)一下.
如果你也遇到這個問題,那就繼續(xù)閱讀這篇文章,我?guī)Т蠹胰シ治龊徒鉀Q這個問題.
解決方案
這里我們先給出解決方案,然后再具體分析產(chǎn)生原因哈.避免分析的大段文字阻礙了同學(xué)學(xué)習(xí)的熱情.
解決方案非常簡單,一句話概括是:給Splash Activity設(shè)置一個主題,主題內(nèi)容是:全屏+透明.
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>
經(jīng)過如上配置,困擾你的白屏、黑屏、ActionBar屏應(yīng)該都已經(jīng)煙消云散了.為了知其然,并知其所以然,希望同學(xué)能繼續(xù)跟我一起分析一下這些白屏產(chǎn)生的原因.
Activity組件的窗口啟動過程
首先聲明,本段內(nèi)容大量參考了羅升陽老師的博客。為了方便理解,對其內(nèi)容進行了壓縮。如果侵權(quán),我立刻刪掉這段分析哈。
想要了解白屏產(chǎn)生的根源,就不得不去跟蹤Activity組件的窗口啟動過程。Activity組件在啟動的過程中,會調(diào)用ActivityStack類的成語函數(shù)startActivityLocked方法。注意,在調(diào)用ActivityStack類的成語函數(shù)startActivityLocked方法的時候,Activity組件還處于啟動過程中,即它的窗口尚未顯示出來,不過這時候ActivityManagerService服務(wù)會檢查是否需要為正在啟動的Activity組件顯示一個啟動窗口。如果需要的話,那么ActivityManagerService服務(wù)就會請求WindowManagerService服務(wù)為正在啟動的Activity組件設(shè)置一個啟動窗口(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;
}
}
}
}
未完待續(xù)…希望大家繼續(xù)關(guān)注。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 完美解決Android App啟動頁有白屏閃過的問題
- Android啟動頁出現(xiàn)白屏、黑屏的解決方案
- Android啟動APP時黑屏白屏的解決方法
- Flutter Android端啟動白屏問題的解決
- 如何正確實現(xiàn)Android啟動屏畫面的方法(避免白屏)
- 解決Android應(yīng)用冷啟動時出現(xiàn)的白屏問題的方法
- Android的App啟動時白屏的問題解決辦法
- Android中Splash應(yīng)用啟動白屏問題的解決方法
- Android中使用Theme來解決啟動app時出現(xiàn)的空白屏問題
- Android app啟動時黑屏或者白屏的原因及解決辦法
- Android編程中activity啟動時出現(xiàn)白屏、黑屏問題的解決方法
- Android 啟動頁白屏解決方案
相關(guān)文章
融會貫通Android?Jetpack?Compose中的Snackbar
這篇文章主要為大家介紹了融會貫通Android?Jetpack?Compose中的Snackbar方法及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
安卓應(yīng)用開發(fā)通過java調(diào)用c++ jni的圖文使用方法
這篇文章主要介紹了2013-11-11
Android NDK 開發(fā)中 SO 包大小壓縮方法詳解
這篇文章主要為為大家介紹了Android NDK 開發(fā)中 SO 包大小壓縮方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
Android ContentProvider查看/讀取手機聯(lián)系人實例
本篇文章主要介紹了Android ContentProvider查看/讀取手機聯(lián)系人實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
Android 通過騰訊TBS實現(xiàn)文件預(yù)覽功能
這篇文章主要介紹了Android 通過騰訊TBS實現(xiàn)文件預(yù)覽功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

