2017-09-15 55 views
2

有許多與退棧管理有關的問題,但沒有一個真的讓我滿意。我發現越接近that one,但它對我來說看起來像一個醜陋的解決方法。防止多次啓動相同的活動

當活動一個上的按鈕點擊,我發起一個活動startActivityForResult(),期待一個簡單一個 - >回堆棧。 但是,如果你垃圾郵件按鈕足夠快,你最終有兩個意圖被解僱,因此兩個活動堆積A - >B - >B

我試圖用FLAG_ACTIVITY_SINGLE_TOP標誌,以防止創建第二活動,但它並沒有改變什麼:

這是活動按鈕偵聽器

btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     Intent intent = new Intent(getApplicationContext(), ActivityB.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 
}); 

並且日誌清楚地指出onCreate()被調用兩次(而不是預期的onNewIntent):

btn.onClick()

activityB.onCreate()

btn.onClick()

activityB.onCreate()

我的活動必須singleTask也不singleInstance,他們應該只是任何常規活動的背部堆棧的一部分。任何許可將非常感謝!

+0

點擊後禁用按鈕。如果你真的擔心,請保留一個標誌來表示是否應該再次調用'startActivityForResult()'。 – CommonsWare

+0

你能發佈你的清單嗎? (關於2個活動) – MatPag

+0

@CommonsWare儘管禁用按鈕聽起來像是一種好方法,但通常它並不有效(特別是在電話繁忙時,或者僅僅是CPU速度較慢的低端設備時)。由於在調用onClick()之前單擊該按鈕可能會發生多次(此時已經完成了損壞並且禁用該按鈕太晚了)。 –

回答

1

你的問題是由你點擊兩次垃圾郵件發起的活動。

以簡單的方式設置布爾型字段來防止啓動兩個活動。

例子:

boolean isClicked; 
button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(!isClicked){ 
       isClicked = true; 
       //start activity here. 
       } 
      } 
     }); 

在你onPause()設置布爾領域

+0

這就是我在問題中關聯的「解決方案」,我想避免。除了事實上,它增加了幾乎10行的無價值代碼,它看起來像噩夢來維持,因爲你可能有幾十個按鈕開放活動。 – bagage

+0

你爲什麼不做一個開始活動的方法。所以無論你在哪裏致電該活動。您可以在單個位置處理位域 –

+1

這是唯一正確的方法。當你點擊一個按鈕時,它不會立即調用'onClick()'方法。所有它發佈的事件「按鈕點擊」到內部事件隊列。根據手機的工作頻率,正在運行的應用程序數量,CPU速度以及一百萬個其他變量(無法控制的變量),可以在調用onClick()方法之前多次點擊該按鈕。你無法阻止這一點。你所能做的就是確保當onClick()被實際調用時,確保你不會多次處理事件。 –