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 :

 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

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.

  1. Se envía solicitud de proveedor de contenido
  2. Su aplicación no se estaba ejecutando, y Android inicia un nuevo proceso para ella.
  3. Se crea la instancia de aplicación personalizada
  4. Se llama Application.onCreate() .
  5. Inicia una actividad
  6. 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> 
  • No se puede resolver el símbolo 'OnMapReadyCallback' Problema
  • ¿Hay alguna manera de especificar el requisito de arquitectura del procesador en el manifiesto de Android?
  • No se puede establecer diferentes iconos / etiquetas para la aplicación y la actividad del lanzador de manifiesto
  • ¿Cómo crear una aplicación Android con sólo 1 broadcastreceiver?
  • Android cómo crear un esquema de URL personalizado con el formato dado myapp: // http: //
  • Pantalla de llamadas entrantes / salientes personalizadas en Android
  • ¿Cómo especificar qué actividad se inicia al iniciar la aplicación?
  • ¿Cómo aplicar la acción de toque de notificación a una actividad específica en android?
  • La aplicación no se muestra en las listas de aplicaciones recientes
  • Clave de Google Maps en AndroidManifest.xml de google-services.json
  • Icono de aplicación que falta en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.