2016-04-26 123 views
1

我想知道是否可以清除舊的活動。我想用enventBus來做到這一點。的活動的堆疊的使用eventBus清除特定活動的堆棧活動

實施例:

startActivity(A) then startActivity(B) then startActivity(C) then startActivity(D)... 

活動B被登記的onEvent(ClearStackFromHere()),與eventBus。

而且從活動d我要發佈的事件後(新ClearStackFromHere)與eventBus了。

那麼,是不是可以清除的B活動堆棧?

我應該寫我ClearStackFromHere裏面是什麼()。

謝謝,

+1

我不認爲這是可能的,因爲當您想清除堆棧時,活動B不活動。你有嘗試過使用startActivityForResult嗎?然後,您將能夠按照您想要的順序處理結果和關閉活動。 –

+2

我有感覺EventBus在這裏沒有幫助。也許你可以用粘性事件做些事情,但請首先考慮如何不做。 –

+0

好的,我會在onResult上看到每個活動: - [感謝您的回答 – Johnny

回答

1

我在我的一個項目中實現了類似的解決方案。

我需要的是保持在後面堆棧只有最近的3個活動,在他們面前清除別人的方式。這隻適用於我的應用程序中的某個導航流,其中有可能將無限量的活動添加到後退堆棧中。

例如一打開B- - 這將打開C,則C可以打開A或B的另一個實例...等

我要指出,這個解決方案使用EventBus 2.4.0,有可能是3.0來實現它更好的方法+。

首先,我定義了一個名爲ActivityTracker幫手。它跟蹤活動當前處於活動狀態以及每個活動的標識符。它還具有可以調用的方法來完成後面堆棧中除最近n個數量之外的所有活動。

public class ActivityTracker { 

    private static ArrayList<String> activityStack = new ArrayList<>(); 

    //Notify the Tracker of a new Activity to track 
    public static void activityActive(String uuid){ 
     addToBackStack(uuid); 
    } 

    //Notify the tracker of an Activity that should no longer be tracked 
    public static void finishing(String uuid){ 
     removeFromBackStack(uuid); 
    } 

    //Call this to clear entire back stack 
    public static void killAllBackStackActivities(){ 
     killPreviousActivities(0); 
    } 

    //Call this to clear back stack while keeping most recent X amount 
    private static void killPreviousActivities(int keepAmount){ 

     if(activityStack.size() <= keepAmount) { 
      return; 
     } 

     //Copy to not manipulate while looping. 
     String[] tempList = activityStack.toArray(new String[activityStack.size()]); 

     int counter = activityStack.size(); 
     for(String id : tempList){ 

      if(counter == keepAmount){ 
       return; 
      } 

      counter--; 

      //Send notification to kill specific activity 
      EventBus.getDefault().post(new ActivityShouldDieEvent(id)); 
     } 
    } 

    private static void addToBackStack(String uuid){ 
     if(!activityStack.contains(uuid)){ 
      activityStack.add(uuid); 
      killPreviousActivities(3); //Always kill all activities except most recent 3. 
     } 
    } 

    private static void removeFromBackStack(String uuid){ 
     if(activityStack.contains(uuid)) 
      activityStack.remove(uuid); 
    } 
} 

然後,我所定義的AppCompatActivity一個子類,稱爲BackStackTrackActivity。應用中的所有相關活動都會擴展此課程。子類看起來是這樣的:

public class BackStackTrackActivity extends AppCompatActivity { 

    //Random ID for activity to be identified by 
    protected String uuid = UUID.randomUUID().toString(); 

    //Receive notification that activity should finish 
    public void onEvent(ActivityShouldDieEvent ev){ 
     if(ev.getUuid().equals(this.uuid)){ 
      finish(); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     //Unregister from EventBus 
     EventBus.getDefault().unregister(this); 
     //Tell tracker to stop tracking 
     ActivityTracker.finishing(uuid); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Register for events 
     EventBus.getDefault().register(this); 
     //Tell tracker to track activity 
     ActivityTracker.activityActive(uuid); 
    } 

} 

一段時間的努力,我想你一定能適應這種解決方案到的東西,滿足您的需求。

我希望有幫助。