Android – Empêche l’écran blanc au démarrage

Comme nous le soaps tous, de nombreuses applications Android affichent un écran blanc très brièvement avant que leur première Activity soit mise au point. Ce problème est observé dans les cas suivants:

  • Applications Android qui étendent la classe Application globale et y effectuent des initialisations majeures. L’object Application est toujours créé avant la première Activity (ce qui peut être observé dans le débogueur), cela a donc un sens. C’est la cause du retard dans mon cas.

  • Applications Android qui affichent la fenêtre de prévisualisation par défaut avant l’écran de démarrage.

Définir android:windowDisablePreview = "true" ne fonctionne évidemment pas ici. Je ne peux pas non plus définir le thème parent de l’écran de démarrage sur Theme.Holo.NoActionBar comme décrit ici , car [malheureusement] mon écran de démarrage utilise un ActionBar .

Pendant ce temps, les applications qui ne prolongent pas la classe Application ne montrent pas l’écran blanc au démarrage.

Le fait est que, idéalement, les initialisations effectuées dans l’object Application doivent avoir lieu avant que la première Activity soit affichée. Donc, ma question est, comment puis-je effectuer ces initialisations au démarrage de l’application sans utiliser un object Application ? Peut-être utiliser un Thread ou un Service , je suppose?

C’est un problème intéressant à considérer. Je ne peux pas le contourner de la manière habituelle (en définissant le thème NoActionBar ), car mon écran Splash a ActionBar un ActionBar pour des raisons indépendantes.

Remarque:

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

  • Comment réparer un écran blanc sur une application?

  • Écran de démarrage Android est blanc au début?

  • Écran blanc avant écran de démarrage

  • Fond blanc lorsque l’application Android démarre

  • Pourquoi un écran blanc apparaît-il pendant 1 seconde lors du démarrage des applications sous Android?

Les références:

  • Patterns – Lance les écrans .

  • Ecran de lancement de marque: le nouveau splash pour Android .

  • Splash Screens de la bonne façon .

Le problème avec le fond blanc est dû au démarrage à froid d’androïde pendant que l’application se charge en mémoire, et cela peut être évité avec ceci:

 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(); } } } 

disposition

           

img face

       

Ajouter ce thème à votre écran d'introduction dans le manifeste

     

qui produira efect comme ça

un chat occupé

pour plus de détails et plus de solutions, vous pouvez consulter ce blog

veuillez append cette ligne dans votre thème d’application

 true 

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

Mais plus important encore, optimisez votre charge initiale et transférez tout travail lourd lorsque vous avez le temps de l’exécuter. Publiez votre classe de candidature ici si vous souhaitez que nous y jetions un coup d’oeil.

Veuillez copier et coller ces deux lignes dans votre thème d’application manifeste, à savoir res / styles / AppTheme. alors ça marchera comme du charme ..

 true true 

Avez-vous essayé de définir l’atsortingbut android:windowBackground dans le thème de votre activité de lanceur, sur une couleur ou sur un dessin?

Par exemple ceci:

 @android:color/black 

Lorsqu’elle est ajoutée au thème d’activité Lanceur, une couleur noire (plutôt que blanche) apparaît au démarrage. C’est une astuce facile pour cacher une longue initialisation, tout en montrant quelque chose à vos utilisateurs, et cela fonctionne très bien même si vous sous-classe l’object Application.

Évitez d’utiliser d’autres constructions (même des 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’object Application est l’endroit approprié pour effectuer exactement ce type d’actions.

Dans les méthodes de rappel du cycle de vie, vous pouvez déclarer le comportement de votre activité lorsque l’utilisateur quitte et réintègre l’activité. Rappelez-vous que la façon dont Android est conçu, il existe un cycle de vie pour chaque application. Si vous mettez trop de charge sur la méthode onCreate() (qui est la méthode utilisée pour charger les fichiers de mise en page et initaliser les commandes que vous avez), alors l’écran blanc deviendra plus visible, car le fichier de mise en page prendra plus de temps pour charge.

Je suggère d’utiliser plusieurs méthodes différentes lors du démarrage d’une activité. Tels sont le onStart() (appelé en premier lieu une fois l’application chargée), onActivityCreated() (appelé après l’affichage de la présentation et utile si vous effectuez un traitement de données au démarrage de l’activité).

Pour vous faciliter la tâche, vous trouverez ci-dessous le diagramme du cycle de vie officiel de l’activité:

entrer la description de l'image ici

J’ai eu le même problème, vous devez mettre à jour votre style.

style.xml

   

Votre fichier de manifeste doit ressembler à ci-dessous.

  // Other stuff  

Dehors:

entrer la description de l'image ici

J’espère que cela vous aidera.

Les deux propriétés fonctionnent

   

Avez-vous essayé de mettre l’initialisation sur onActivityCreated ?

Classe d’ Application interne:

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { if(activity.getClass().equals(FirstActivity.class) { // try without runOnUiThread if it will not help activity.runOnUiThread(new Runnable() { @Override public void run() { new InitializatioTask().execute(); } }); } } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }); 

Comme vous savez déjà pourquoi cet écran blanc est là, en raison des processus d’arrière-plan ou de l’initialisation de l’application ou des fichiers volumineux, vérifiez simplement ci-dessous l’idée de surmonter cela.

Pour éviter que cet écran blanc au début de l’application ne soit un écran de démarrage, c’est juste une façon non finale et vous devez l’utiliser.

Lorsque vous afficherez l’écran de démarrage à partir de votre fichier splash.xml, alors ce problème restra le même,

Vous devez donc créer un style dans le fichier style.xml pour l’écran d’accueil et définir le fond de la fenêtre en tant que votre image de démarrage, puis appliquer ce thème à votre activité de démarrage à partir d’un fichier manifeste. Alors maintenant, lorsque vous exécuterez l’application, elle définira d’abord le thème et de cette manière, l’utilisateur pourra voir directement l’image de démarrage au lieu de l’écran blanc.

La manière recommandée de résoudre ce problème manque dans les réponses. Donc j’ajoute ma réponse ici. Le problème de l’écran blanc au démarrage se produit à cause de l’écran vierge initial que le processus du système dessine lors du lancement de l’application. Un moyen courant de résoudre ce problème est de désactiver cet écran initial en l’ajoutant à votre fichier styles.xml .

 true 

Mais selon la documentation Android, cela peut entraîner un temps de démarrage plus long. La méthode recommandée pour éviter cet écran blanc initial selon Google consiste à utiliser l’ windowBackground thème windowBackground l’activité et à fournir un simple dessin personnalisé pour l’activité de démarrage.

Comme ça:

Fichier de mise en page my_drawable.xml , my_drawable.xml

         

Créez un nouveau style dans votre styles.xml

     

Ajoutez ce thème à votre activité de départ dans le fichier manifeste

  

Et lorsque vous souhaitez revenir à votre appel de thème normal setTheme(R.style.Apptheme) avant d’appeler super.onCreate() et setContentView()

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // Make sure this is before calling super.onCreate setTheme(R.style.Theme_MyApp); super.onCreate(savedInstanceState); // ... } } 

C’est la manière recommandée de résoudre le problème et c’est à partir des modèles de conception de matériel de google.

Écrivez simplement l’élément dans values ​​/ styles.xml:

 @android:color/black 

Par exemple, dans AppTheme:

  

Je recommanderais de jeter un oeil à la réponse donnée à cette page . Résolu en utilisant la propriété Style. Cela ne dérange pas l’utilisateur.

 Style :-  In Manifest :-