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> 
  • Diferentes versiones de Android para diferentes entornos
  • Cordova Android duplicado usa-función de dos complementos
  • ¿Cómo establecer la etiqueta diferente para el lanzador en lugar del título de la actividad?
  • ¿Cuál es el uso de <permission-group> en android?
  • Java.lang.ClassNotFoundException en loader dalvik.system.PathClassLoader en el lanzamiento de la aplicación
  • SherlockFragmentActivity que causa ClassNotFoundException
  • Aplicación de Android que debe instalarse sólo en el teléfono y no en las tabletas
  • Diferencia entre usos-permiso
  • ¿Es posible bloquear SMS salientes?
  • Nombre de icono de la aplicación Android escogido de la etiqueta de actividad que de la etiqueta de la aplicación
  • ¿Cómo puedo crear una intención navegable en el manifiesto android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.