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.
- Cómo agregar programaticamente una cuenta personalizada en android?
- La forma más segura de usar SharedPreferences
- Alternativa de Java para el desarrollo de Android
- Comunicación de Android a node.js
- Seguimiento de FTP subir datos en android?
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... } }
- Android: Error al cargar la imagen en diferentes versiones de Android
- ANR en SurfaceView en dispositivos específicos solamente - La única solución es un tiempo de sueño corto
- Intent.putExtra (String, Bundle) vs Intent.putExtra (Bundle)
- ¿Cómo eliminar el permiso específico al crear una aplicación para Android con gradle?
- Necesidad de entender algún código java
- Manera portable de garantizar que el campo del año de un DateFormat es solamente dos dígitos
- ¿Cómo esperar que todas las tareas en un ThreadPoolExecutor terminen sin apagar el Ejecutor?
- ¿Cuál sería un método para crear un contador de números en Android?
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 } }
- ¿Es posible en Android para findView por id de cadena?
- ¿Hay una manera fácil de tener el aviso de derechos de autor añadido automáticamente por android studio?