我在我的一個項目中實現了類似的解決方案。
我需要的是保持在後面堆棧只有最近的3個活動,在他們面前清除別人的方式。這隻適用於我的應用程序中的某個導航流,其中有可能將無限量的活動添加到後退堆棧中。
例如一打開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
一個子類,稱爲BackStackTrackActivity
。應用中的所有相關活動都會擴展此課程。子類看起來是這樣的:
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);
}
}
一段時間的努力,我想你一定能適應這種解決方案到的東西,滿足您的需求。
我希望有幫助。
我不認爲這是可能的,因爲當您想清除堆棧時,活動B不活動。你有嘗試過使用startActivityForResult嗎?然後,您將能夠按照您想要的順序處理結果和關閉活動。 –
我有感覺EventBus在這裏沒有幫助。也許你可以用粘性事件做些事情,但請首先考慮如何不做。 –
好的,我會在onResult上看到每個活動: - [感謝您的回答 – Johnny