Aplicación de Android vs. Actividad
He escrito algunas aplicaciones de Android, y siempre he declarado una Activity
inicio como:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
Sería genial para el escopo de algunos métodos globales, estáticos, compartidos prefs, etc, si yo pudiera iniciar mi aplicación utilizando una Application
que luego llama a la primera Activity
de su onCreate()
después de la creación de prefs, etc, pero no he sido capaz Para encontrar cualquier ejemplo de este patrón de diseño … cuando intento esto en código, obtengo una ClassCastException
:
- ¿Cómo puedo borrar todas las actividades de la pila?
- Android: ¿Es posible leer el nombre del paquete dentro del archivo AndroidManifest.xml?
- Mezcla de manifiesto de Android: diferentes actividades de lanzamiento del proyecto de biblioteca
- ¿Están gradle tools: selector for permissions works ever?
- El flujo maestro / detallado tiene un nivel mínimo de api igual al uso
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // do stuff (prefs, etc) // start the initial Activity Intent i = new Intent(this, InitialActivity.class); startActivity(i); } }
InitialActivity.class
es de hecho una Activity
que funciona bien si la configuro como MAIN
, pero intentar iniciarla desde MyApplication
que se declara MAIN
genera el error. Probablemente una pregunta muy tonta, pero estoy abordando todo esto mal?
Gracias,
Pablo
- Requerir permiso sólo para versiones android anteriores: maxSdkVersion no funciona?
- Actividad infantil en Android
- AndroidMainfest - ¿debería tener un filtro de intención múltiples acciones?
- Valor de versión de usuario de AndroidManifest.xml en código
- Android Studio me está agregando android.permission.USE_CREDENTIALS en mi manifiesto
- Cómo iniciar la aplicación en el botón de encendido presione
- Siempre vuelve a la pantalla de inicio de sesión
- Android permiso de creación de base de datos
Puede solucionar esto utilizando el flag FLAG_ACTIVITY_NEW_TASK
:
Intent intent = new Intent(this, ApplicationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
Esto se debe a que es necesario iniciar una nueva tarea cuando la actividad se inicia fuera del contexto de la actividad. Pero recomiendo encarecidamente que no onCreate()
Actividad de la aplicación onCreate()
.
Android tiene 4 componentes: Actividad, Servicio, ContentProvider y Broadcast.
Cuando Android necesita activar uno de estos componentes de su aplicación, parece que ya hay un proceso en ejecución con su aplicación. Si no es así, Android inicia un nuevo proceso, lo inicializa y, a continuación, inicializa su instancia de aplicación personalizada. Y luego activa uno de los componentes necesarios.
Ahora, consideremos el siguiente escenario: su proveedor de contenido declarado de aplicación en AndroidManifest.xml
, y Android a punto de iniciar su aplicación para que pueda proporcionar algunos datos a otra aplicación de primer plano.
- Se envía solicitud de proveedor de contenido
- Su aplicación no se estaba ejecutando, y Android inicia un nuevo proceso para ella.
- Se crea la instancia de aplicación personalizada
- Se llama
Application.onCreate()
. - Inicia una actividad
- Su proveedor de contenido recibe una solicitud
Alguien sólo quería conectarse a su proveedor de contenido, pero su aplicación inició una actividad en su lugar. Lo mismo es cierto para iniciar el servicio de fondo y, a veces, los receptores de difusión.
Y también considere si alguna actividad de otra aplicación A quería iniciar la actividad X de su aplicación. Pero en onCreate()
inició la actividad Y, y luego X también es iniciado por Android. Entonces el usuario presiona hacia atrás. ¿Qué debería pasar? Es complicado…
Iniciar las actividades de la Application
onCreate
puede resultar en una experiencia de usuario muy extraña. Así que no lo hagas.
ACTUALIZACIÓN: Debido a que Android garantiza que la Aplicación se creará sólo una vez y antes de cualquier otro componente, puede usar el siguiente código para acceder a la instancia única de su Aplicación:
public class MyApplication extends Application { private static MyApplication s_instance; public MyApplication() { s_instance = this; } public static MyApplication getApplication() { return s_instance; } }
¿La estableció en su etiqueta de actividad de manifiesto para esta intención que está comenzando (otra además de su principal)?
</activity> <activity android:name=".InitialActivity" android:label="@string/app_name"> <intent-filter> <action android:name="com.package.INITACT" /> <--- this is only name by which you activity can be called. <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
- Configuración del valor de propiedad Singleton en el Listado de Firebase
- Dagger no puede encontrar miembros inyectables en un módulo