2017-07-16 13 views
0

我有3個activites,他們是:一個主要removeExtra(密鑰)的活動意圖將導致不能添加它再次

A和B都可以啓動並切換到主要,反之亦然,但我只想當主要知道它是由一個開始,然後做某事,所以我把意圖額外只有一個當它開始主要

/*In Activity A*/ 
Intent intent = new Intent(A_Activity.this, Main_Activity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);          
intent.putExtra("myKey", true); 
startActivity(intent); 

一次主要得到值,開始做某事,一切都很好:

/*in MainActivity*/ 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     boolean shouldDo = getIntent().getBooleanExtra("myKey", false); 
     if (shouldDo) { 
      // do sth 
     } 
    } 

問題是myKeyintent似乎依然存在,所以從現在開始,連路線是從主要,上面的代碼也將主要執行的,所以我把remove extra主,喜歡吞myKey

/*in Main_Activity*/ 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     boolean shouldDo = getIntent().getBooleanExtra("myKey", false); 
     if (shouldDo) { 
      getIntent().removeExtra("myKey"); 
      // do sth 
     } 
    } 

那麼,這裏是當我做這種情況下,問題:切換從主至A,以及c我回來了。那麼將永遠不會檢測到myKey了,這裏有什麼問題?

+0

你能檢查MainActivity.onNewIntent()是否被調用嗎?我認爲可能是這樣的,每次MainActivity啓動時(在第一個之後),來自'A'或'B'的'Intent'在這裏被傳送。 https://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent) –

+0

是的,我可以看到我的EMPTY'onNewIntent(Intent intent)'在'onResume (......)',不太明白正規醫生說的,是否解釋了我的情況? – Shawn

回答

1

使用Intent.FLAG_ACTIVITY_SINGLE_TOP啓動MainActivity第二次(或第三次等)時間時,顯示活動的過程與正常情況稍有不同。系統正在重新使用您現有的活動,而不是創建新活動。

當您打電話給getIntent()時,您收到的對象Intent是您第一次打開它時傳遞給您的對象。每次之後,您用來重新啓動MainActivityIntent將被傳遞給onNewIntent()

解決的辦法是重新考慮如何訪問您在onResume()中使用的Intent額外。做這樣的事情:

public class MainActivity extends ActionBarActivity { 

    private boolean shouldDo; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     shouldDo = getIntent().getBooleanExtra("myKey", false); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     shouldDo = intent.getBooleanExtra("myKey", false); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (shouldDo) { 
      ... 
     } 
    } 
} 

換句話說,使用getIntent()在第一時間,以及使用之後的每一次傳遞給onNewIntent()Intent設置shouldDo值。

+0

這有點令人困惑,我的邏輯必須依賴於當前Activity如何創建,所以有一天我創建沒有'SINGLE_TOP'的'MainActivity','onNewIntent()'不會再被調用,對嗎? – Shawn

+0

是的,'onNewIntent()'只在一個活動重新啓動時被調用。你可以在這裏閱讀更多:https://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent) –