2010-07-19 12 views
6

Estoy escribiendo un programa que ofrece un cuadro de diálogo de respuesta rápida al recibir un SMS.android abrir la actividad de diálogo sin abrir la actividad principal detrás de él

Sin embargo, estoy obteniendo un resultado inesperado. Cuando recibo un SMS, aparece la actividad de diálogo adecuada que muestra el número de teléfono y el mensaje correctos; sin embargo, hay una segunda actividad detrás que es la actividad 'predeterminada' en mi programa (es lo que se abre cuando lance mi aplicación)

No quiero que surja esta segunda actividad. La actividad de respuesta rápida debería aparecer por encima de todo lo que el usuario estaba haciendo antes.

La actividad 'flotante':

public class quickReply extends Activity { 
String mNumber, mMessage; 
TextView mMainText; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mMainText = (TextView)findViewById(R.id.mainText); 

    try{ 
     Intent i = getIntent(); 
     Bundle extras = i.getExtras(); 

     mNumber = extras.getString("theNumber"); 
     mMessage = extras.getString("theMessage"); 
     this.setTitle("Message From:" + mNumber); 
     mMainText.setText(mMessage); 


    } catch(Exception e) { 
     mMainText.setText(e.getMessage()); 
    }  

} 

}

La llamada a la actividad dentro de un OnReceive()

 Intent i = new Intent(context, quickReply.class); 
    i.putExtra("theNumber", mNumber); 
    i.putExtra("theMessage", mMessage); 
    i.setFlags(
      Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 

El Manifiesto:

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".quickReply" 
       android:label="@string/app_name" 
       android:theme="@android:style/Theme.Dialog" 
       > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
     <receiver android:name=".SmsReceiver"> 
     <intent-filter> 
      <action android:name= 
       "android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

</application> 

Respuesta

3

la única manera que he encontrado que funciona, en la definición de la actividad en el manifiesto:

android:launchMode="singleInstance" 

pero luego se va a relanzar su actividad/por defecto una vez que se desestimó el diálogo. NOTA: perderá todo el estado del lanzamiento anterior, por lo que esta es una solución menos que ideal.

ACTUALIZACIÓN:

también se puede hacer esto:

Intent.FLAG_ACTIVITY_CLEAR_TASK 

así que aquí es lo que hice:

  1. abrir la actividad original/principal
  2. de un servicio, el lanzamiento la actividad de estilo de diálogo utilizando lo anterior (el principal se va de adiós).
  3. cuando el usuario cierra el diálogo, se inicia principal de nuevo con una intención adicional (IS_BACK) que se procesa en onCreate() y llama:

    moveTaskToBack (true);

esto mantendrá la tarea bajo el diálogo en la parte superior y la principal en la parte posterior de la pila.

0

Debe establecer la afinidad de tarea de la actividad en algo diferente de su actividad principal. Esto lo separará de la actividad principal y lo rastreará como una tarea separada:

<activity android:name=".quickReply" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.Dialog" 
      android:launchMode="singleTask" 
      android:taskAffinity="quickReply" 
      > 
Cuestiones relacionadas