我想知道是否有可能清除旧活动中的所有活动。我想用enventBus来做这件事。
一系列活动的示例:
startActivity(A) then startActivity(B) then startActivity(C) then startActivity(D)...
活动B使用eventBus在事件(ClearStackFromHere())上注册。
从活动D开始,我想用eventBus发布活动帖子(新的ClearStackFromHere)。
那么,是否有可能从B中清除一堆活动?
我应该在ClearStackFromHere()中写什么。
谢谢,
答案 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
通过一些工作,我认为您将能够将此解决方案调整为满足您需求的解决方案。
我希望有所帮助。