2015-12-16 47 views
5

我有Activity,可以直接從瀏覽器啓動,調用url。如何從URL打開後清除活動中的意圖數據?

活動代碼:

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"); 
    } 

    //... 
} 

應用程序清單代碼:

... 

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

    ... 

此代碼的工作非常完美。當我使用環節(http://example.com/somepage.html)從瀏覽器中打開應用程序,我有這樣的輸出:

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

但是如果我離開這個應用程序(使用後退按鈕)和開放式應用程序再次,從最近的菜單,我得到了相同的結果:

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

我想清除方法onCreate中的意圖數據。還是有辦法檢測,當應用程序從最近的菜單啓動?

UPD: 我試着這樣做:

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

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

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

但它並不能幫助。

+0

在'onDestroy'做'使用setData(NULL);' –

+0

我發現getIntent ().removeExtra( 「鑰匙」); – koutuk

+0

它沒有幫助 –

回答

2

通過下面的代碼刪除intent.getData()

編輯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); 

編輯2:

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

希望這會幫助你。

+1

沒有它沒有幫助 –

+0

@ArthurKorchagin,我編輯了答案,請檢查 –

+0

@ArthurKorchagin,如果不工作編輯1請嘗試編輯2 –

-1

您可以撥打下面的方法來清除意圖

getIntent().removeExtra("key"); 

只需用源傳給的意圖名稱替換「關鍵」。

+0

這是錯誤的。 getExtent()。removeExtra(key)將移除一個名爲[key]的包值,而不是意圖。 – ichalos

2

你想做的方式違背了Android系統的原則。 Android的設計使Intent打開Activity,然後如果您想從最近的菜單打開這個Activity,它會收到相同的意圖。

我只是猜測,如果你使用one-Activity-many-fragments方法,那麼你會發現它的一個缺點。 Android Intent系統的設計方式是使用One Screen - One Activity方法,這是最佳做法。

如果我錯了,你還有其他一些情況,知道它會很有趣。然後,您可能會想到如何重新設計應用程序以實現您的需求。

0

與其更改意圖數據,您可以存儲意圖的散列,並在每次應用獲得焦點時比較該散列。這樣你就可以看到是否有新的意圖。

例子:

int currentIntent = getIntent().hashCode(); 

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

這不會起作用,因爲哈希碼是每次不同,但目的相同仍來自通過 – rajath

0

在你onCreate方法你有

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

更改爲

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

你試過嗎?我做了一個'setIntent(new Intent())',但我仍然有舊的意圖 – Boy

相關問題