業(yè)務(wù)要求:FM播放頁、主播主頁敬察、欄目詳情頁可以依托播放頁循環(huán)點(diǎn)擊(如:播放頁——主播主頁——播放頁——欄目詳情頁)秀睛。但返回這三個頁面都只保留一個,再回到主頁静汤。
采坑日常:
1琅催、啟動模式:
A居凶、singleTask: 一開始腦子第一反應(yīng)就是用啟動模式來實(shí)現(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贸典,他是單一實(shí)例视卢,具備所有singleTask的特點(diǎn),唯一不同的是廊驼,它是存在于另一個任務(wù)棧中据过。然后ActivityA->ActivityB->ActivityC→ActivityA(三個都是singleInstance模式),發(fā)現(xiàn)返回都正常妒挎,以為弄好了绳锅。然后Home鍵,應(yīng)用退到后臺酝掩,再次打開的時候發(fā)現(xiàn)鳞芙,居然回到了主頁。這是因?yàn)楫?dāng)重新啟動的時候期虾,系統(tǒng)會先去找主棧(我是這么叫的)里的activity原朝,也就是APP中LAUNCHER的activity所處在的棧。查看是否有存在的activity镶苞。沒有的話則會重新啟動LAUNCHER竿拆。這就很不符合我們的業(yè)務(wù)需要了。有解決辦法嗎宾尚?其實(shí)不是沒有,但是我想到解決辦法實(shí)在是自己都不愿意用谢澈。所以果斷放棄了煌贴。
2、既然正常的系統(tǒng)的模式無法滿足我的需要锥忿,我就在想牛郑,該怎么辦呢?后來想了下敬鬓,干脆自己來維護(hù)好了淹朋,反正就三個頁面笙各。所以就自己寫了個棧。
public class FMActivityStack {
private static Stack<Activity> stack;
private FMActivityStack() {
stack = new Stack<>();
}
// 當(dāng)前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础芍,還報(bào)了一個錯誤ConcurrentModificationException(同時修改的意思)杈抢。這樣就實(shí)現(xiàn)了我想要的效果了。