2013-04-25 13 views
6

Sono perplesso su questo comportamento che sto vivendo in un'applicazione Sto sviluppando ...dati intento non di compensazione quando l'utente preme il pulsante di allora recenti applicazioni pulsante

breve:

dati intento non è svuotare quando l'utente preme il pulsante Indietro per uscire dall'applicazione e quindi preme il pulsante recente per reinserire l'applicazione. (Ogni altro caso, i dati intento è sgomberato)

lungo:

Ho un'applicazione con una schermata iniziale che viene utilizzato per raccogliere i dati che viene passato in da uno schema URI. Ho quindi impostato l'intenzione di inoltrare i dati all'attività principale. L'attività principale ha frammenti e si basa sul modello principale/dettaglio.

I dati di intenti vengono cancellati in tutti i casi, ad esempio premendo il pulsante Home e quindi tornando all'applicazione, premendo il pulsante delle app recenti e quindi tornando all'applicazione, ecc. L'unico caso in cui i dati dell'intento non viene cancellato quando l'utente preme il pulsante Indietro e quindi il pulsante delle app recenti per tornare all'applicazione.

frammenti di codice rilevanti che coinvolgono gli intenti:

// Splash Screen Activity 
@Override 
protected void onPostExecute(Void result) { 
    // Data is done downloading, pass notice and app ids to next activity 
    Intent intent = new Intent(getBaseContext(), ListActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.putExtra("id1", id1); 
    intent.putExtra("id2", id2); 
    intent.putExtra("id3", id3); 
    startActivity(intent); 
    finish(); 
} 


// ListActivity retrieving intent data 
Intent intent = getIntent(); 
if (intent != null) { 
    this.id1 = intent.getExtras().getString("id1"); 
    this.id2 = intent.getExtras().getString("id2"); 
    this.id3 = intent.getExtras().getString("id3"); 
} 


// ListActivity clearing intent data 
@Override 
public void onPause() { 
    super.onPause(); 
    // Clear intent data 
    Intent intent = getIntent(); 
    intent.putExtra("id1", ""); 
    intent.putExtra("id2", ""); 
    intent.putExtra("id3", ""); 
} 

voglio sottolineare che ho anche provato ad utilizzare intent.removeExtra ("ID1"), ma anche questo non ha funzionato.

Qualche idea su cosa sta succedendo? È come se Android mantenesse il vecchio intento anche se onPause() viene sempre chiamato per cancellare i dati di intent.

risposta

1

Per aggirare il problema che stavo affrontando, ho scelto di utilizzare SharedPreferences come mezzo per passare i dati tra le attività.

So che SharedPreferences non è in genere utilizzato per questo scopo, ma ha risolto il problema e funziona.

2

Credo che la differenza qui sia che il tasto Indietro sta effettivamente facendo terminare la tua attività, dove premendo "Home" la tua attività sarà messa in pausa, ma non completata.
Quindi, quando il processo viene riportato in primo piano nel caso Inizio, riprende semplicemente un'istanza Attività già esistente, mentre nel caso Indietro, il sistema crea un'istanza di una nuova copia dell'attività, chiamando onCreate() e passandogli un nuova copia dell'ultima intenzione registrata per quell'attività.

1

In onPause() si sta cancellando gli extra in un "copia" del Intent. Si può provare ad aggiungere

setIntent(intent); 

a onPause() dopo aver eliminato gli extra (anche se chiamando removeExtra() probabilmente anche lavorare invece di impostare extra per svuotare le stringhe).

NOTA: Tuttavia, suggerirei che questo disegno sia difettoso. Non utilizzare lo Intent per tenere traccia dello stato nell'applicazione. Dovresti salvare qualche stato nelle preferenze condivise perché questo sopravviverà alla tua uccisione/riavvio dell'app, al riavvio del telefono o altro.

Il problema è che il nuovo Intent non è attivo, in modo che se l'utente preme il tasto HOME e l'app passa in secondo piano e Android uccide l'app perché non è attiva, quando l'utente torna all'app , Android creerà un nuovo processo per la tua app e ricreerà l'attività utilizzando l'intento originale .

Inoltre, se si legge la documentazione per getIntent(), si dice che restituisce l'intenzione che ha avviato l'attività.

+0

Non utilizzo l'intento di salvare lo stato dell'applicazione. L'intento è principalmente utilizzato per trasmettere i dati ricevuti da uno schema Uri personalizzato che viene utilizzato per avviare la mia app. Lo schema Uri contiene un ID che viene recuperato nella schermata iniziale e quindi passato alla listività come si vede nel codice sopra. Ho anche provato setIntent (intento) e setIntent (null) ma questo non risolve il problema. – michaelcarrano

+0

Il codice che hai mostrato si confonde con l'intento in 'ListActivity'. Perché lo stai facendo? Se stai usando gli extra per passare alcuni parametri dalla tua schermata iniziale a 'ListActivity', non dovresti provare a cancellarli da 'Intent'. Dovrai mostrare più codice se vuoi aiutare a risolvere questo problema. –

21

in realtà questo è dovuto ad Android di iniziare l'applicazione dalla storia, quindi, gli extra intenti sono ancora lì

si riferiscono a questo interroga Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent

quindi l'aggiunta di questo condizionale per gestire questo caso speciale fissata per me

int flags = getActivity().getIntent().getFlags();  
if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { 
    // The activity was launched from history 
    // remove extras here 
} 
+0

Grande - questa è la soluzione per risolvere questo problema duraturo! Grazie! – tjm1706

+0

Funziona !!! Grazie mille. –

+0

è funzionante .. grazie – Priya

Problemi correlati