2015-12-16 5 views
5

Ho Activity, che può essere lanciato direttamente dal browser, chiamando url.Come cancellare i dati di intenti in Attività dopo l'apertura dall'URL?

Codice attività:

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Uri data = getIntent().getData(); 
     Log.d(getClass().getName(), "onCreate data=" + data); 

     getIntent().replaceExtras(new Bundle()); 
     getIntent().setAction(""); 
     getIntent().setData(null); 
     getIntent().setFlags(0); 

     if (data != null && isValidUrl(data)) { 
      // open some special fragment 
     } else { 
      // open main fragment 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d(MainActivity.class.getName(), "onDestroy"); 
    } 

    //... 
} 

Applicazione codice manifesto:

... 

    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW"/> 

      <category android:name="android.intent.category.DEFAULT"/> 
      <category android:name="android.intent.category.BROWSABLE"/> 

      <data 
       android:host="example.com" 
       android:pathPrefix="/" 
       android:scheme="http"/> 
     </intent-filter> 
    </activity> 

    ... 

Questo codice funziona perfettamente. Quando apro un'applicazione dal browser usando collegamento (http://example.com/somepage.html), ho questo output:

D/com.package.MainActivity: onCreate data=http://example.com/somepage.html 

Ma se lascio l'applicazione (utilizzando il tasto indietro) e l'applicazione aperta ancora una volta, dal recente menù, ottengo lo stesso risultato:

D/com.package.MainActivity: onDestroy 
D/com.package.MainActivity: onCreate data=http://example.com/somepage.html 

voglio cancellare i dati intenti nel metodo onCreate. O c'è modo di rilevare, quando l'applicazione viene lanciata dal menu recente?

UPD: Ho provato a fare questo:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    getIntent().replaceExtras(new Bundle()); 
    getIntent().setAction(""); 
    getIntent().setData(null); 
    getIntent().setFlags(0); 

    Log.d(MainActivity.class.getName(), "onDestroy"); 
} 

Ma non aiuta.

+0

in '' onDestroy' fare setData (null); ' –

+0

ho trovato getIntent() .removeExtra ("chiave"); – koutuk

+0

Non aiuta neanche –

risposta

2

Rimuovere intent.getData() dal codice qui sotto:

Edit 1:

Uri data = getIntent().getData(); 
    Log.d(getClass().getName(), "onCreate data=" + data); 

    if (data != null && isValidUrl(data)) { 
     // open some special fragment 
    } else { 
     // open main fragment 
    } 

getIntent().setData(null); 

Edit 2:

getIntent().replaceExtras(new Bundle()); 
getIntent().setAction(""); 
getIntent().setData(null); 
getIntent().setFlags(0); 

Spero che questo vi aiuterà.

+1

No Non aiuta –

+0

@ArthurKorchagin, Ho modificato la risposta, per favore controlla –

+0

@ArthurKorchagin, Se non funziona modifica 1 di per favore prova modifica 2 –

-1

è possibile chiamare il seguente metodo per cancellare il Intent

getIntent().removeExtra("key"); 

Basta sostituire "chiave" con il nome Intent passato dalla sorgente.

+0

Questo è sbagliato. getIntent(). removeExtra (chiave) rimuoverà un valore di bundle chiamato [chiave], non l'intento. – ichalos

2

Il modo in cui si desidera farlo va contro i principi del sistema Android. Android è progettato in modo che Intent apra Activity e quindi se si desidera aprire questo Activity dal menu Recenti riceve lo stesso intento.

Immagino solo che se si utilizza l'approccio one-Activity-many-fragments, si vede uno dei suoi svantaggi. Il sistema Android Intent è progettato per utilizzare l'approccio One Screen - One Activity, che è la migliore pratica.

Se sbaglio e hai qualche altro caso, sarebbe davvero interessante saperlo. Quindi potresti pensare a come ridisegnare l'app per raggiungere i tuoi bisogni.

0

Invece di modificare i dati di intenti, è possibile memorizzare l'hash dell'intenzione e confrontare tale hash ogni volta che l'app ottiene l'attenzione. In questo modo puoi vedere se è presente un nuovo intento.

Esempio:

int currentIntent = getIntent().hashCode(); 

if (lastIntent != currentIntent) { 
    // do stuff 
} 
+0

Questo non funziona poiché l'hashcode è diverso ogni volta, ma lo stesso intento viene comunque ottenuto tramite lo – rajath

0

nel metodo onCreate avete

if (data != null && isValidUrl(data)) { 
// open some special fragment 
} else { 
// open main fragment 
} 

Scelgo

if (data != null && isValidUrl(data)) { 
    // open some special fragment 
    getIntent().setData(null); 
    setIntent(getIntent()); //This will set the new intent to have no data, 
    //so future launches won't relaunch the data url. 
    } else { 
    // open main fragment 
    } 
+0

. Hai provato questo? Ho fatto un 'setIntent (new Intent())' e ancora ottengo il vecchio intento – Boy

Problemi correlati