簡體   English   中英

使用 eventBus 從特定活動中清除堆棧活動

[英]Clear stack activities from specific activity with eventBus

我想知道是否可以清除舊活動中的所有活動。 我想使用 enventBus 來做到這一點。

一系列活動的示例:

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

活動 B 在事件總線上注冊 onEvent(ClearStackFromHere())。

從 Activity DI 也想用 eventBus 發布事件帖子(新的 ClearStackFromHere)。

那么,是否可以從 B 中清除活動堆棧?

我應該在 ClearStackFromHere() 里面寫什么。

謝謝,

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

我需要的是一種方法,將最近的 3 個活動保留在后台堆棧中,並清除它們之前的其他活動。 這僅適用於我的應用程序中的某個導航流,在這種情況下,可以將無限數量的活動添加到后台堆棧中。

例如 A 打開 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);
    }
}

然后,我定義了一個名為BackStackTrackActivityAppCompatActivity子類。 應用程序中的所有相關活動都擴展了這個類。 子類如下所示:

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);
    }

}

通過一些工作,我認為您將能夠將此解決方案調整為滿足您需求的東西。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM