151 votes

Android - Empêcher l'apparition d'un écran blanc au démarrage

Comme nous le savons tous, de nombreuses applications Android affichent un écran blanc très brièvement avant leur première Activity se précise. Ce problème est observé dans les cas suivants :

  • Des applications Android qui étendent le champ d'action mondial Application et effectuer les principales initialisations dans cette classe. Le site Application est toujours créé avant le premier objet Activity (un fait qui peut être être observé dans le débogueur), cela a donc du sens. C'est la cause du retard dans mon cas.

  • Applications Android qui affichent la fenêtre d'aperçu par défaut avant l'écran d'accueil.

Réglage de android:windowDisablePreview = "true" ne fonctionne évidemment pas ici. Je ne peux pas non plus définir le thème parent de l'écran d'accueil comme suit Theme.Holo.NoActionBar comme décrit ici parce que [malheureusement] mon écran d'accueil utilise un fichier de type ActionBar .

En revanche, les applications qui n'étendent pas le Application classe ne pas afficher l'écran blanc au démarrage.

Le fait est que, dans l'idéal, les initialisations effectuées dans les Application l'objet doit se produire avant le premier Activity est affiché. Ma question est donc la suivante : comment puis-je effectuer ces initialisations au démarrage de l'application ? sans en utilisant un Application objet ? En utilisant éventuellement un Thread ou Service Je suppose.

C'est un problème intéressant auquel il faut réfléchir. Je ne peux pas le contourner de la manière habituelle (en définissant le paramètre NoActionBar ), car tragiquement, mon écran Splash a en réalité un thème ActionBar pour des raisons non liées.

Note :

J'ai déjà évoqué les questions suivantes :

Références :

1 votes

Vous avez trouvé le problème vous-même, vous faites trop d'init dans le contexte de l'application, bloquant le chargement de l'activité, essayez d'asynchroniser ceci, laissant une activité de chargement s'afficher jusqu'à ce qu'un thread se termine.

0 votes

Ce site pourrait aider

0 votes

Avez-vous envisagé le chargement paresseux ? Je pense que vous êtes sur la bonne voie avec des services qui ne sont pas sur le fil principal.

128voto

Hitesh Singh Points 22

Veuillez ajouter cette ligne dans le thème de votre application

<item name="android:windowDisablePreview">true</item>

pour plus d'informations : https://developer.Android.com/topic/performance/vitals/launch-time#themed

43 votes

Il suspend l'application pendant 2 secondes, puis la lance, ce qui n'est pas utile pour moi !

4 votes

Grate maintenant il n'est pas montrer #ffffff couleur mais il est maintenant montrer #000000

0 votes

@Faakhir Avez-vous trouvé une solution ? Je cherche toujours une solution, qui supprime cet écran blanc et aussi il n'y a pas de retard au moment du lancement.

102voto

Ivan Milisavljevic Points 1169

Le problème de l'arrière-plan blanc est causé par le démarrage à froid d'Android pendant que l'application se charge en mémoire, et il peut être évité de cette façon :

public class OnboardingWithCenterAnimationActivity extends AppCompatActivity {
public static final int STARTUP_DELAY = 300;
public static final int ANIM_ITEM_DURATION = 1000;
public static final int ITEM_DELAY = 300;

private boolean animationStarted = false;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_onboarding_center);
}

@Override
public void onWindowFocusChanged(boolean hasFocus) {

    if (!hasFocus || animationStarted) {
        return;
    }

    animate();

    super.onWindowFocusChanged(hasFocus);
}

private void animate() {
    ImageView logoImageView = (ImageView) findViewById(R.id.img_logo);
    ViewGroup container = (ViewGroup) findViewById(R.id.container);

    ViewCompat.animate(logoImageView)
        .translationY(-250)
        .setStartDelay(STARTUP_DELAY)
        .setDuration(ANIM_ITEM_DURATION).setInterpolator(
            new DecelerateInterpolator(1.2f)).start();

    for (int i = 0; i < container.getChildCount(); i++) {
        View v = container.getChildAt(i);
        ViewPropertyAnimatorCompat viewAnimator;

        if (!(v instanceof Button)) {
            viewAnimator = ViewCompat.animate(v)
                    .translationY(50).alpha(1)
                    .setStartDelay((ITEM_DELAY * i) + 500)
                    .setDuration(1000);
        } else {
            viewAnimator = ViewCompat.animate(v)
                    .scaleY(1).scaleX(1)
                    .setStartDelay((ITEM_DELAY * i) + 500)
                    .setDuration(500);
        }

        viewAnimator.setInterpolator(new DecelerateInterpolator()).start();
    }
}
}

mise en page

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?colorPrimary"
android:orientation="vertical"
>

<LinearLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical"
    android:paddingTop="144dp"
    tools:ignore="HardcodedText"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        android:alpha="0"
        android:text="Hello world"         android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
        android:textColor="@android:color/white"
        android:textSize="22sp"
        tools:alpha="1"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="8dp"
        android:alpha="0"
        android:gravity="center"
        android:text="This a nice text"
      android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle.Inverse"
        android:textSize="20sp"
        tools:alpha="1"
        />

    <Button
        android:id="@+id/btn_choice1"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:scaleX="0"
        android:scaleY="0"
        android:text="A nice choice"
        android:theme="@style/Button"
        />

    <Button
        android:id="@+id/btn_choice2"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:scaleX="0"
        android:scaleY="0"
        android:text="Far better!"
        android:theme="@style/Button"
        />

</LinearLayout>

<ImageView
    android:id="@+id/img_logo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:src="@drawable/img_face"
    tools:visibility="gone"
    />
</FrameLayout>

visage en image

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:opacity="opaque">

<item android:drawable="?colorPrimary"/>
<item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/img_face"/>
</item>

Ajoutez ce thème à votre écran d'accueil dans le manifeste.

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowBackground">@null</item>
</style>

<style name="AppTheme.CenterAnimation">
    <item name="android:windowBackground">@drawable/ll_face_logo</item>
</style>

ce qui produira un effet comme celui-ci

a busy cat

Pour plus de détails et de solutions, vous pouvez consulter le site suivant BlogPost

5 votes

Cela n'a pas aidé, toujours un écran blanc et une animation à la fin.

0 votes

Il s'agit d'une mise en œuvre directe. Il pourrait y avoir d'autres parties de votre code qui causent le problème. Veuillez poser une autre question et je serai là pour vous aider :)

1 votes

J'ai résolu ce problème en faisant une animation entre les thèmes et en changeant le thème sans qu'il soit possible de dessiner, mais en gardant la même couleur de fond, puis en faisant en sorte que le contenu soit visible lors de l'onWindowFocusChanged() et en l'animant, ce qui n'est pas le cas de mon contenu qui a blanchi entre la transition.

39voto

prasad reddy Points 101

Veuillez copier et coller ces deux lignes dans votre thème d'application manifeste, c'est-à-dire res/styles/AppTheme, et cela fonctionnera comme sur des roulettes.

<item name="android:windowDisablePreview">true</item>
<item name="android:windowIsTranslucent">true</item>

0 votes

Ne fonctionne pas pour moi

22voto

George Metaxas Points 899

Avez-vous essayé de régler le android:windowBackground dans le thème de votre activité de lancement, à une couleur ou un dessin ?

Par exemple ceci :

<item name="android:windowBackground">@android:color/black</item>

lorsqu'il est ajouté au thème d'activité du lanceur, il affichera une couleur noire (plutôt que la couleur blanche) au démarrage. C'est une astuce facile pour cacher une longue initialisation, tout en montrant quelque chose à vos utilisateurs, et cela fonctionne bien même si vous sous-classez l'objet Application.

Évitez d'utiliser d'autres constructions (même les Threads) pour effectuer de longues tâches d'initialisation, car vous risquez de ne pas pouvoir contrôler le cycle de vie de ces constructions. L'objet Application est l'endroit approprié pour effectuer exactement ce type d'actions.

2 votes

Meilleure réponse, ne pas oublier d'ajouter au thème noir, pas seulement blanc)

21voto

Shmuel Points 1414

Tout d'abord, pour supprimer l'écran blanc, lisez ceci - https://www.bignerdranch.com/blog/splash-screens-the-right-way/

Mais surtout, optimisez votre charge initiale et reportez tout travail lourd au moment où vous aurez le temps de l'exécuter. Postez votre classe d'application ici si vous voulez que nous y jetions un œil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X