English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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

Introduzione

Credo che molti sviluppatori Android abbiano incontrato questa esigenza:

 1. Implementa una schermata di Splash, sulla quale ci sono un'immagine di sfondo relativa all'app e un pulsante di inizio.
 2. Dopo aver cliccato il pulsante e entrato nella homepage, l'utente non vedrà più la schermata di Splash quando aprirà l'app in futuro. 

Credo che molti studenti abbiano incontrato questo tipo di confusione:

• Durante la seconda entrata nell'applicazione, anche se hai saltato direttamente alla homepage dalla schermata di Splash, c'è ancora un momento in cui compare uno schermo bianco, nero o uno schermo bianco con ActionBar.

Se anche tu incontri questo problema, continua a leggere questo articolo, ti guiderò a analizzare e risolvere questo problema.

Soluzione

Ecco prima di dare la soluzione, poi analizzeremo in dettaglio le cause. Evitiamo che il testo analitico ostacoli l'entusiasmo degli studenti.

La soluzione è molto semplice, in una frase può essere riassunta come: assegna un tema alla Splash Activity, il contenuto del tema è: a schermo intero + trasparente.

Aggiungi il tema SplashTheme in style.xml:

<style name="SplashTheme" parent="AppTheme">
 <item name="android:windowFullscreen">true</item>
 <item name="android:windowIsTranslucent">true</item>
</style>

Configurazione del tema per SplashActivity in AndroidManifest.xml:

<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>

Dopo la configurazione sopra menzionata, i problemi di schermo bianco, schermo nero e schermo ActionBar che ti disturbavano dovrebbero essere spariti. Per sapere non solo il come, ma anche il perché, spero che gli studenti possano continuare a analizzare con me le cause di questi schermi bianchi.

Il processo di avvio della finestra del componente Activity

Prima di tutto, devo dichiarare che questo contenuto si basa in gran parte sul blog di Luo Shengyang. Per facilitare la comprensione, il contenuto è stato compresso. Se c'è violazione del copyright, lo eliminerò immediatamente.

Per comprendere la causa del white screen, è necessario tracciare il processo di avvio della finestra del componente Activity. Durante il processo di avvio, il componente Activity chiama il metodo startActivityLocked della classe ActivityStack. Attenzione, al momento della chiamata al metodo startActivityLocked della classe ActivityStack, il componente Activity si trova ancora nel processo di avvio, ossia la sua finestra non è stata ancora visualizzata, ma in questo momento il servizio ActivityManagerService verifica se è necessario mostrare una finestra di avvio per il componente Activity in avvio. Se necessario, il servizio ActivityManagerService richiede al servizio WindowManagerService di impostare una finestra di avvio per il componente Activity in avvio (ps: questa finestra di avvio è la causa del white screen).

1. ActivityStack.startActivityLocked

public class ActivityStack {
 // impostato a false per disabilitare laanteprima mostrata mentre una nuova attività
 // sta venendo avviata.
 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;
 // Posiziona la nuova attività in cima alla pila, quindi è accanto a quella da interagire
 // con l'utente.
 if (addPos < 0) {
  addPos = NH;
 }
 // Inserisci l'attività nella pila della cronologia e procedi
 mHistory.add(addPos, r);
 if (NH > 0) {
  // Vogliamo mostrare la finestra di anteprima di avvio se siamo
  // passando a una nuova attività, o il processo dell'attività successiva è
  // non è attualmente in esecuzione.
  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;
  }
 }
 }
}

Da continuare... Speriamo che continui a seguirci.

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento, e speriamo che tu continui a supportare e gridare le lezioni.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta ai rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.