三個Activity循環(huán)點擊,返回只保留一個本身

業(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)了我想要的效果了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容