使用eventBus清除特定活动的堆栈活动

时间:2016-04-26 17:02:57

标签: java android greenrobot-eventbus

我想知道是否有可能清除旧活动中的所有活动。我想用enventBus来做这件事。

一系列活动的示例:

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

活动B使用eventBus在事件(ClearStackFromHere())上注册。

从活动D开始,我想用eventBus发布活动帖子(新的ClearStackFromHere)。

那么,是否有可能从B中清除一堆活动?

我应该在ClearStackFromHere()中写什么。

谢谢,

1 个答案:

答案 0 :(得分:1)

我在其中一个项目中实施了类似的解决方案。

我需要的是一种方法,只保留后堆栈中最近的3个活动,并清除其他活动。这仅适用于我的应用程序中的某个导航流程,在该流程中可以将无限量的活动添加到后台堆栈。

e.g。 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);
    }
}

然后,我定义了一个名为AppCompatActivity的{​​{1}}的子类。应用程序中的所有相关活动都会扩展此课程。子类看起来像这样:

BackStackTrackActivity

通过一些工作,我认为您将能够将此解决方案调整为满足您需求的解决方案。

我希望有所帮助。