業(yè)務(wù)要求:FM播放頁、主播主頁、欄目詳情頁可以依托播放頁循環(huán)點擊(如:播放頁——主播主頁——播放頁——欄目詳情頁)。但返回這三個頁面都只保留一個,再回到主頁。
采坑日常:
1、啟動模式:
A、singleTask: 一開始腦子第一反應(yīng)就是用啟動模式來實現(xiàn),先想到singleTask。但是他會移除他之上的所有棧。ActivityA→ActivityB→ActicityC→ActivityA(三個都是singleTask模式),系統(tǒng)會先從內(nèi)部開始把ActivityA與ActicityC之間的Acticity全部結(jié)束onDestroy。然后暫停ActicityC,調(diào)用ActivityA的onNewIntent->onRestart->onStart->onResume然后再停止并結(jié)束ActicityC。所以多次循環(huán)后,就不會三個界面都有一個讓你去返回了。就不符合我們的業(yè)務(wù)要求了。
B、singleInstance: 后來想想用singleInstance,他是單一實例,具備所有singleTask的特點,唯一不同的是,它是存在于另一個任務(wù)棧中。然后ActivityA->ActivityB->ActivityC→ActivityA(三個都是singleInstance模式),發(fā)現(xiàn)返回都正常,以為弄好了。然后Home鍵,應(yīng)用退到后臺,再次打開的時候發(fā)現(xiàn),居然回到了主頁。這是因為當重新啟動的時候,系統(tǒng)會先去找主棧(我是這么叫的)里的activity,也就是APP中LAUNCHER的activity所處在的棧。查看是否有存在的activity。沒有的話則會重新啟動LAUNCHER。這就很不符合我們的業(yè)務(wù)需要了。有解決辦法嗎?其實不是沒有,但是我想到解決辦法實在是自己都不愿意用。所以果斷放棄了。
2、既然正常的系統(tǒng)的模式無法滿足我的需要,我就在想,該怎么辦呢?后來想了下,干脆自己來維護好了,反正就三個頁面。所以就自己寫了個棧。
public class FMActivityStack {
private static Stack<Activity> stack;
private FMActivityStack() {
stack = new Stack<>();
}
// 當前Activity推入棧中
public static void pushActivity(Activity activity) {
if (stack == null) {
stack = new Stack<>();
}
if (activity != null) {
finishTheOthers(activity);
stack.add(activity);
}
}
/**
* 移除之前存在的activity
*
* @param activity
*/
public static void finishTheOthers(Activity activity) {
if (stack == null) return;
for (Iterator<Activity> it = stack.iterator(); it.hasNext(); ) {
Activity sa = it.next();
if (sa.getLocalClassName().equals(activity.getLocalClassName())) {
sa.finish();
it.remove();
}
}
}
}
一開始沒有用Iterator,還報了一個錯誤ConcurrentModificationException(同時修改的意思)。這樣就實現(xiàn)了我想要的效果了。