[英]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);
}
}
然后,我定義了一個名為BackStackTrackActivity
的AppCompatActivity
子類。 應用程序中的所有相關活動都擴展了這個類。 子類如下所示:
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.