Java 使用eventBus从特定活动中清除堆栈活动
我想知道是否有可能清除旧活动中的所有活动。我想使用enventBus来实现这一点 一组活动的示例: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中清除活动堆栈 我应
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);
}
}