1

我的主要活動是處理ACTION_SEND意圖。我根據意圖文本中收到的數據在數據庫中添加了一條新記錄。我的問題是,android在顯示方向改變後顯然保留了這個意圖,所以每當我旋轉我的手機時,最後我的數據庫中會出現一行。由於方向變化導致的多個意向處理

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.db_list); 

    Intent intent = getIntent(); 
    String action = intent.getAction(); 
    String type = intent.getType(); 

    if (Intent.ACTION_SEND.equals(action) && type != null) { 
     if ("text/plain".equals(type)) { 
      storeTextInDatabase(intent); 
     } 
    } 

    fillListFromDB(); 
    registerForContextMenu(getListView()); 

} 

我怎樣才能achive storeTextInDatabase(意向)調用只有一次,每個新接收的意圖之後。 我的第一個想法是,我將檢查savedInstanceState包的內容,如果它爲null,那麼它是Activity的第一個調用。此解決方案存在問題,我想在我的活動壽命期間處理多個廣播的意圖。

回答

3

嘗試處理意向,然後刪除你剛處理,即:

intent.removeExtra(Intent.EXTRA_TEXT)多餘的;

它適用於我。 僅在2.3強硬的測試。

+0

它工作,比我的解決方案更容易。 – Peter

+0

我一直在做這件事,但它剛剛開始與KitKat 4.4打成一片。 –

0

在您的清單文件中,您可以跳過onCreate操作以更改方向。如果你改變方向,它不會創建新的實例。如果你不想添加,你可以保持狀態,並檢查在創建不處理相同的數據。保存到SharedPreferences以獲取上次保存的數據標識符,並確保您沒有處理相同的事情。

<activity 
     android:name="com.microsoft.adal.LoginActivity" 
     android:configChanges="orientation" 
     android:label="@string/title_activity_login" > 
    </activity> 
+0

我不想停止方向更改。將比較最新數據與新數據進行比較的第二個想法並不糟糕,但我仍在尋找更優雅的解決方案。 – Peter

2

我嘗試了很多東西。他們大多數是失敗的:

  • 在意圖處理不成功後調用setIntent(null)。不知何故原定意圖在方向改變後回來。
  • 我在意圖的包中設置了一個額外的值。這裏同樣的問題。
  • 我嘗試了Activity的onNewIntent()方法。它從未呼喚過我。

有一件事看起來很有效果。我使用onSavedInstance來設置應用程序狀態包的變量。它在方向更改之間保留,但在處理新的Intent時未設置。

private static final String KEY_INTENT_PROCESSED = "intent processed"; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.db_list); 

    Intent intent = getIntent(); 
    String action = intent.getAction(); 
    String type = intent.getType(); 

    boolean alreadyProcessed = savedInstanceState == null ? false : savedInstanceState.getBoolean(KEY_INTENT_PROCESSED); 

    if (Intent.ACTION_SEND.equals(action) && type != null 
      && !alreadyProcessed) {    
     if ("text/plain".equals(type)) { 
      storeTextInDatabase(intent); 
     } 
    } 

    fillListFromDB(); 
    registerForContextMenu(getListView()); 

} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable(KEY_INTENT_PROCESSED, true); 
}