Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用eventBus从特定活动中清除堆栈活动_Java_Android_Greenrobot Eventbus - Fatal编程技术网

Java 使用eventBus从特定活动中清除堆栈活动

Java 使用eventBus从特定活动中清除堆栈活动,java,android,greenrobot-eventbus,Java,Android,Greenrobot Eventbus,我想知道是否有可能清除旧活动中的所有活动。我想使用enventBus来实现这一点 一组活动的示例: startActivity(A) then startActivity(B) then startActivity(C) then startActivity(D)... 活动B在eventBus上注册为一个Event(ClearStackFromHere()) 在活动D中,我想用eventBus发布事件帖子(new ClearStackFromHere) 那么,是否可以从B中清除活动堆栈 我应

我想知道是否有可能清除旧活动中的所有活动。我想使用enventBus来实现这一点

一组活动的示例:

startActivity(A) then startActivity(B) then startActivity(C) then startActivity(D)...
活动B在eventBus上注册为一个Event(ClearStackFromHere())

在活动D中,我想用eventBus发布事件帖子(new ClearStackFromHere)

那么,是否可以从B中清除活动堆栈

我应该在我的文件中写些什么


谢谢,

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

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

e、 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);
    }
}
通过一些工作,我认为您将能够使此解决方案适应您的需要


我希望这会有所帮助。

我认为这是不可能的,因为当您要清除堆栈时,活动B未处于活动状态。您是否尝试过改用startActivityForResult?然后你就可以按照你想要的顺序处理结果和结束活动了。我感觉EventBus在这里帮不上忙。也许你可以做一些有粘性的事情,但请先想想没有粘性你怎么做。好吧,那么。。。我将看到每个活动的结果:-[谢谢回答
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);
    }

}