2017-08-03 68 views
1

在一個現有的項目上工作,我發現這是一個相當不常見的實現(至少對我而言)。由於我沒有與之前已經離開的開發人員聯繫,並且在我將此視爲僅僅從代碼庫的另一部分複製和粘貼代碼的情況之前,我想向SO社區詢問這一點。使用EventBus從基本活動完成活動?

這是你的延伸BaseActivity每天的活動,並實施:

class SomeActivity : BaseActivity(R.layout.some_activity) { 
    ... 
    private fun close() { 
     if(backToMain) 
      finish() 
     } 
     else 
      goToMain(this) 
    } 

    companion object { 
     fun goToMain(activity: AppCompatActivity) { 
      val intent = Intent(activity, MainActivity::class.java) 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) 
      activity.startActivity(intent) 
      EventBus.getDefault().post(Event(Event.Type.ActivityFinish)) 
     } 
    } 
    ... 
} 

在BaseActivity.kt,有一個訂閱它調用結束事件()。

@Subscribe override fun onEvent(event: Event) { 
    when (event.type) { 
     Event.Type.ActivityFinish -> super.finish() 
     else -> {} 
    } 
} 

現在,爲什麼會有人用EventBus調用Activity.finish()從擴展BaseActivity,而不是僅僅調用它,然後有(在上面SignActivity)? 即使SomeActivity實際上是片段,您也可以簡單地致電getActivity.finish()

*至於意圖的標誌,你也可以使用Activity.finishAffinity()完成在後面堆棧中的所有活動,如果你的分SDK是16

預先感謝餵養我的好奇心。 :d

+0

它可能是一個場景,'登錄=>註冊(上成功註冊,簽到殺死並採取用戶一些其它屏幕)=> Somesceen' –

+0

這實際上是一個合法的情況。但是,這意味着兩個活動之間的溝通,而不是一個活動,它是擴展的基礎。 – Aba

回答

0

所以,這是與此交易。一些人在屏幕上盯着屏幕幾次,並且在代碼庫上工作得更多之後,我發現以前的開發人員實際上使用了其他活動中的goToMain函數(人們是否真的這樣做?O_o)。儘管如此,由於「活動」對象仍然通過,因此我沒有理由在此特定場景中使用EventBus(因爲您可以撥打activity.finish())。

總結,開發人員可能只是從應用程序的不同部分調整了這段代碼,認爲這是它的工作原理。


什麼是EventBus

EventBus是一個Android優化事件總線,簡化之間活動,片段,線程,服務 通信

即未運行的靜態方法調用一個活動自己的擴展功能。

+0

所以,寫評論是非常重要的:) – BakaWaii

+0

@BakaWaii事實上,這是 – Aba

0

更新 - 這個答案提的是,項目前正在使用最低API等級16

我看着你的代碼,我覺得開發商有落後很好的意圖。他想要清除堆棧中的所有活動。喜歡這裏他用FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_NEW_TASK但它需要API等級> 11

通過BaseActivity添加訂閱,我們可以確保Activity將廣播Event.Type.ActivityFinish標籤與使用EventBus後不再存在。如果您考慮要清除堆棧的註銷情況,那麼該方法將用作更安全的方法。

+0

關於意圖標誌,您可以簡單地調用Activity.finishAffinity(),並且簡單地說,對於後面堆棧中的所有活動,都會調用finish()。所以,我不認爲這解釋了爲什麼你會使用EventBus。 – Aba

+0

在API級別16之後再次出現'Activity.finishAffinity'。有關更多檢查,請參閱https://stackoverflow.com/questions/33497151/activity-finishaffinity-vs-intent-flag-activity-new-task-intent-flag-activit我認爲用這種方法殺死活動並不壞。 – Rahul

+0

請原諒我對API級別的無知。你是對的。這些標誌是可以使用的(只是我的項目特別是minSdk 16)。儘管如此,我不認爲這是爲什麼使用EventBus的原因,因爲您可以簡單地在末尾調用finish()。 – Aba