web-dev-qa-db-fra.com

Android afficher Splash-Screen pendant le chargement

J'ai une application Android qui affiche un "écran de démarrage" pendant 3 secondes. Après cela, MainActivity est chargé.

Malheureusement, le chargement de MainActivity nécessite environ 4 secondes supplémentaires. Au premier démarrage encore plus longtemps. Cependant, lorsque l'application est chargée, tout se passe bien.

Maintenant, comment puis-je y arriver, que MainActivity soit chargé pendant l'affichage de l'écran de démarrage? Il devrait juste afficher une image jusqu'à ce que le tout soit complètement chargé ..__ J'ai lu sur Async-Task, mais je ne suis pas sûr de savoir où le mettre et comment l'utiliser correctement Quelqu'un peut m'aider s'il vous plaît?

SplashScreen.Java

public class SplashScreen extends Activity {
    private static int SPLASH_TIME_OUT = 3000;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_startup);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent i = new Intent(SplashScreen.this, MainActivity.class);
                startActivity(i);
                finish();
            }
        }, SPLASH_TIME_OUT);
    }
}

MainActivity.Java

public class MainActivity extends Activity implements OnClickListener, MediaController.MediaPlayerControl {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Some heavy processing
        //starting services
        //starting Google Text to Speech
        //and so on...

    }

}
10
HorstB

Vous ne devez pas créer de nouveau fil au démarrage, mais créer une vue qui ne doit pas attendre le chargement de vos ressources, comme indiqué dans cet article: Écrans de démarrage correctement .

Comme indiqué dans l'article, vous devez créer un layer-list pouvant être dessiné au lieu d'un fichier XML layout:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <!-- Fill the background with a solid color -->
    <item Android:drawable="@color/gray"/>

    <!-- Place your bitmap in the center -->
    <item>
        <bitmap
            Android:gravity="center"
            Android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

Créez ensuite un thème en utilisant le fichier pouvant être dessiné comme arrière-plan. J'utilise l'attribut background au lieu de l'attribut windowBackground comme suggéré dans l'article, car background prend en compte le statut et les barres de navigation, en centrant mieux le dessin. J'ai également défini windowAnimationStyle sur null afin que l'écran de démarrage n'anime pas la transition vers MainActivity:

<resources>

    <!-- Base application theme -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

    <!-- Splash Screen theme -->
    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="Android:background">@drawable/background_splash</item>
        <item name="Android:windowAnimationStyle">@null</item>
    </style>

</resources>

Puis déclarez votre thème dans le manifeste pour votre SplashActivity:

<activity Android:name=".SplashActivity"
    Android:theme="@style/SplashTheme">
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />

        <category Android:name="Android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Et finalement, tout ce que vous avez à faire dans votre SplashActivity est de démarrer votre MainActivity, et l'écran de démarrage ne s'affichera que le temps qu'il faudra à votre application pour configurer:

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}
29
Bryan

votre code d'écran de démarrage fonctionne bien, mais lorsque vous appelez la prochaine activité, dans onCreate (), utilisez Asynctask pour vos tâches lourdes ... 

0
Puneet Kumar

Dans un souci de simplicité, vous combinez votre activité splash avec votre activité principale? De cette façon, vous obtenez le meilleur des deux mondes, à savoir un écran de démarrage pendant la première préparation de vos données et un démarrage rapide lors de la préparation précédente. Faire attendre l'utilisateur pour rien n'est pas vraiment une bonne forme ...

Quelque chose comme:

public class MainActivity extends Activity implements OnClickListener, MediaController.MediaPlayerControl {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Initially shows splash screen, the main UI is not visible
        setContentView(R.layout.activity_main);  

        // Start an async task to prepare the data. When it finishes, in
        // onPostExecute() get it to call back dataReady()
        new PrepareDataAsyncTask(this).execute();

    }

    public void dataReady() {
        // Hide splash screen
        // Show real UI
    }

}
0
Theo Lassonder

J'ai eu le même problème. Il y avait un écran de chargement vide (pas même la barre d'outils). Mu coupable était dans le manifeste dans le MainActivity:

 Android:launchMode="singleInstance"
0