首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Android Activity 棧管理:任意關閉指定 Activity 實現邏輯

     編輯:關於C++

場景痛點

購物 App 流程:商品頁 → 登錄頁 → 註冊頁 → 充值頁。充值成功後需關閉中間所有頁面返回商品頁。且用戶可隨時點擊返回鍵逐級退回,不能提前 finish 中間頁面。

解決方案:Activity 緩存池

維護一個靜態 List 保存所有啟動的 Activity 實例。提供靜態方法:

  • addActivity(Activity):在 onCreate 中調用,加入池中。
  • finishActivity():遍歷池中所有 Activity 調用 finish(),清空棧。
  • finishSingleActivity(Activity):關閉指定實例並從池移除。
  • finishSingleActivityByClass(Class):按類名關閉(如關閉登錄、註冊、充值頁)。

核心代碼

public class CacheActivity {
    public static List activityList = new LinkedList<>();

    public static void addActivity(Activity activity) {
        if (!activityList.contains(activity)) activityList.add(activity);
    }

    public static void finishActivity() {
        for (Activity act : activityList) act.finish();
        activityList.clear();
    }

    public static void finishSingleActivity(Activity activity) {
        if (activity != null && activityList.contains(activity)) {
            activityList.remove(activity);
            activity.finish();
        }
    }

    public static void finishSingleActivityByClass(Class cls) {
        Activity target = null;
        for (Activity act : activityList) {
            if (act.getClass().equals(cls)) { target = act; break; }
        }
        finishSingleActivity(target);
    }
}

使用示例

// 每個 Activity 的 onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    CacheActivity.addActivity(this);
}

// 充值成功後
CacheActivity.finishSingleActivityByClass(LoginActivity.class);
CacheActivity.finishSingleActivityByClass(RegisterActivity.class);
CacheActivity.finishSingleActivityByClass(RechargeActivity.class);
// 僅剩 MainActivity 顯示

優缺點分析

  • 優點:集中管理,靈活關閉任意頁面,保持返回鍵邏輯正常。
  • 缺點:持有 Activity 引用可能導致內存洩露(需在 onDestroy 移除),不適用於進程級任務棧管理。

進階方案:使用 Application.ActivityLifecycleCallbacks 自動管理,或採用單 Activity + Fragment 架構徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved