2010-07-19 13 views
6

Im scrivendo un programma che offre una finestra di dialogo di risposta rapida al ricevimento di un SMS.attività di dialogo aperto Android senza aprire attività principale dietro di esso

Tuttavia, sto ottenendo un risultato inaspettato. Quando ricevo un SMS, viene visualizzata l'attività di dialogo appropriata con il numero di telefono e il messaggio corretti, tuttavia esiste una seconda attività dietro di essa che è l'attività "predefinita" nel mio programma (è ciò che si apre quando lancio la mia applicazione)

Non voglio che questa seconda attività venga fuori. L'attività di risposta rapida dovrebbe venire da sola sopra a qualsiasi cosa l'utente stesse facendo prima.

Il 'flottante' attività:

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 chiamata all'attività all'interno di 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); 

manifesto:

<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> 

risposta

3

l'unico modo che ho trovato che funziona, nella definizione di attività in palese:

android:launchMode="singleInstance" 

, ma poi si deve rilanciare la vostra attività/default principale una volta la finestra di dialogo è respinto. NOTA: perderete tutti gli stati dal lancio precedente, quindi questa è una soluzione tutt'altro che ideale.

UPDATE:

si può anche fare questo:

Intent.FLAG_ACTIVITY_CLEAR_TASK 

ecco quello che ho fatto:

  1. aprire l'attività principale/originale
  2. da un servizio, di lancio l'attività di stile di dialogo che utilizza il precedente (la parte principale è ciao ciao).
  3. quando l'utente chiude la finestra di dialogo, ricominciare principale con un intento extra (IS_BACK) che viene elaborato in onCreate() e chiama:

    moveTaskToBack (true);

questo manterrà l'attività sotto la finestra di dialogo in cima e il principale nella parte posteriore della pila.

0

È necessario impostare l'affinità dell'attività dell'attività su qualcosa di diverso dall'attività principale. Questo lo separerà dall'attività principale e traccerà come attività separata:

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