2011-02-05 25 views
5

Estoy interceptando mensajes SMS con algo de información en ellos. Luego en mi SmsListener estoy creando una notificación para mostrar en la barra de estado. Entonces, cuando el usuario hace clic en una notificación Quiero¿Cómo llevar una actividad al primer plano (o crear si no existe)?

  1. Llevar MainActivity a primer plano (Si no existe dicha actividad, sin embargo, debe crearse)
  2. Pass para que los datos de los sms
  3. realizar algunas ui cambios basándose en estos datos en este MainActivity

Mi actividad se define como

<activity 
     android:name=".MainActivity" 
     android:screenOrientation="sensor" 
     android:label="@string/app_name" 
     android:launchMode="singleTask"/> 

La actividad se puso en marcha como

Intent i = new Intent(); 
i.setClass(context, MainActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(i); 

También en mi actividad he anulado método onNewActivity

@Override 
public void onNewIntent(Intent intent){ 
    super.onNewIntent(intent); 

    // I have data from broadcast in intent variable passed to this activity 
    processDataFromBroadcast(intent); 
} 

Funciona bien si el MainActivity ya existe pero si no existe MainActivity se inicia sin embargo onNewIntent no era llamado

Luego traté de invocar processDataFromBroadcast desde onCreate: processDataFromBroadcast(getIntent()). Los datos de la primera vez se pasan correctamente de mi transmisión a la actividad. Sin embargo, si MainActivity se envía a segundo plano y se vuelve a poner en primer plano, se llama a onCreate o onNewIntent y processDataFromBroadcast se ejecuta nuevamente con intento enviado por broadcast y así mi MainActivity se actualiza con datos de difusión cada vez que la aplicación se pone en primer plano - este último no es deseado, ¿cómo puedo hacer que mi actividad olvide esta intención después del primer manejo? Here is sample application.

Respuesta

5

Para una actividad para poner en marcha una sola instancia de sí mismo, echar un vistazo a la <activity> elemento manifiesto, y en particular android:launchMode. Desea configurarlo con singleTask o singleInstance.

Para pasar datos a su actividad, agregue datos al Intent que usa para abrirlo. Para pasar datos con la intención, use los métodos putExtra() de la intención antes de enviarlos, y los métodos getExtra() para recuperarlos en su actividad de recepción.

Supongo que sabes aproximadamente cómo funcionan los intentos, pero si no puedes obtener más información acerca de los intentos, echa un vistazo a this artículo de desarrolladores de Android.

+0

Gracias por la respuesta. Sin embargo, vea mis actualizaciones a la pregunta. – Solvek

+0

La actividad tiene el método getIntent() para recuperar el intento que desencadenó la actividad. Si solo desea procesar el intento en la primera instanciación, puede hacerlo desde onCreate(). Como ya sabrá, onCreate() solo se invoca cuando la actividad aún no está en la memoria. – rogerkk

+0

Hmm, lo siento, veo que no leí su actualización correctamente ya que ya ha intentado esto. Estoy haciendo exactamente lo que estás haciendo en una de mis aplicaciones, y la única diferencia que puedo ver ahora es que estoy usando el modo de inicio singleInstance, y he configurado android: alwaysRetainTaskState en true. Mi onCreate() definitivamente no se activa al volver a abrir la actividad. – rogerkk

1

en caso de que su problema sigue sin resolverse, como yo estaba corriendo en el mismo tema, así es como lo resolví:

Estoy poniendo una marca de tiempo como intentId como extra de la intención durante su creación. la primera vez, estoy manejando el intento en onCreate() o onNewIntent() Estoy leyendo el intentId y lo guardo como el último intento manejado. así que la próxima vez que se invoque onCreate() o onNewIntet() puedo verificar el intentId y si es igual al ID del último intento manejado, ¡lo ignoro! No sé si esto ayuda en tu caso, tal vez puedas adoptarlo.

Para mantener el intentId independiente de los ciclos de vida de la actividad, puede persistir en los valores de usuario.

Estoy de acuerdo en que uno esperaría que llamar setIntent(new Intent()) en onNewIntent debería hacer el truco.

0

Es tarde para responder, pero podría ser útil para otros que buscan la solución.

Sólo añadir a continuación líneas de código:

Intent mIntent = new Intent(this, SplashActivity.class); 
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting the activity from a service 
mIntent.setAction(Intent.ACTION_MAIN); 
mIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

Dónde SplashActivity es el nombre de la aplicación inicial que es la primera pantalla de la aplicación.

Espero que ayude. :)

Cuestiones relacionadas