Pantalla de presentación de Android durante la carga

Tengo una aplicación de Android, que muestra una "pantalla de bienvenida" durante 3 segundos. Después de eso, MainActivity se carga.

Desafortunadamente, MainActivity tarda ~ 4 segundos en cargarse. En la primera puesta en marcha aún más. Sin embargo, cuando se carga la aplicación, todo se ejecuta sin problemas.

Ahora, ¿cómo puedo lograrlo, que la MainActivity se carga, durante la visualización de la pantalla Splash? Sólo debe mostrar una imagen hasta que todo el asunto cargado completamente. He leído sobre Async-Task, pero no estoy seguro de dónde colocarlo y cómo usarlo correctamente. ¿Puede alguien ayudarme por favor?

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

Si no hay restricciones específicas sobre el tiempo que debe mostrarse la pantalla de bienvenida, puede utilizar el AsyncTask de la siguiente manera:

 public class SplashScreen extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_startup); startHeavyProcessing(); } private void startHeavyProcessing(){ new LongOperation().execute(""); } private class LongOperation extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { //some heavy processing resulting in a Data String for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.interrupted(); } } return "whatever result you have"; } @Override protected void onPostExecute(String result) { Intent i = new Intent(SplashScreen.this, MainActivity.class); i.putExtra("data", result); startActivity(i); finish(); } @Override protected void onPreExecute() {} @Override protected void onProgressUpdate(Void... values) {} } } 

Si los datos resultantes si de otra naturaleza que una Cadena podría poner un Objeto Parcelable como un extra a su actividad. En onCreate puede recuperar los datos con:

getIntent().getExtras.getString('data');

No debería crear un nuevo subproceso en el inicio, sino que debe crear una vista que no tenga que esperar a que se carguen sus recursos, tal y como se detalla en este artículo: Pantallas de bienvenida de la manera correcta .

Como se indica en el artículo, debe crear una layer-list dibujable en lugar de un archivo XML de presentación:

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Fill the background with a solid color --> <item android:drawable="@color/gray"/> <item> <!-- Place your bitmap in the center --> <bitmap android:gravity="center" android:src="@mipmap/ic_launcher"/> </item> </layer-list> 

A continuación, cree un tema utilizando el archivo dibujable como fondo. Utilizo el atributo de background lugar del atributo windowBackground como se sugiere en el artículo, ya que el background toma en cuenta las barras de estado y de navegación, centrando mejor el dibujable. También establezco windowAnimationStyle a null para que la pantalla de bienvenida no anime la transición a MainActivity :

 <resources> <!-- Base application theme --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> </style> <!-- Splash Screen theme --> <style name="SplashTheme"> <item name="android:background">@drawable/background_splash</item> <item name="android:windowAnimationStyle">@null</item> </style> </resources> 

A continuación, declare su tema en el manifiesto para su 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> 

Y, finalmente, todo lo que tienes que hacer en tu SplashActivity es iniciar tu MainActivity y la pantalla de bienvenida solo se mostrará durante el tiempo que MainActivity en configurar tu aplicación:

 public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); } } 

Su código de pantalla de bien funciona bien, pero cuando se llama a la siguiente actividad, a continuación, en onCreate () utilizar Asynctask para sus tareas pesadas …

¿Qué tal si, en interés de la simplicidad, combinas tu actividad de salpicadura con tu actividad principal? De esta manera obtendrás lo mejor de ambos mundos, es decir, una pantalla de bienvenida mientras tus datos se preparan por primera vez, y un arranque rápido cuando se ha preparado previamente. Hacer que el usuario espere por nada no es realmente buena forma …

Algo como:

 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 } } 
  • Eclipse + FindBugs - excluir archivos de filtro no funciona
  • Diferentes resultados de expresión regular en Java SE y plataforma Android
  • Cadenas en android / java, replace () no hace nada
  • Problema Proguard con SAAgent (accesorio Samsung) java.lang.NoSuchMethodException: <init>
  • Dobles, comas y puntos
  • EditText - cambia el texto mientras escribe
  • Android stackoverflow utilizando while loop
  • Cambiar el estilo del menú contextual en Android
  • SetAlpha para ver programaticamente
  • RecyclerView muestra los datos eliminados en la lista
  • ¿Hay algo similar al sistema de recursos de Android en una escala menor?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.