首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 判斷 Context 來源 Activity 的正確方法

     編輯:程式設計綜合問答

問題背景

開發者常遇到需判斷 Context 具體來自哪個 Activity 的場景,例如在通用工具類、基類或攔截器中根據來源 Activity 執行不同邏輯。直接傳遞 Context 並無法直觀獲取其所屬 Activity 類別。

錯誤嘗試

Intent intent = new Intent(context, Demo.class);
context.startActivity(intent);
// 嘗試從 context 反推來源 Activity,但 Context 本身不攜帶來源資訊

正確解決方案

方法一:顯式傳遞來源標識(推薦)

在啟動目標 Activity 時,通過 Intent.putExtra() 明確傳遞來源標識:

// 來源 Activity
Intent intent = new Intent(SourceActivity.this, TargetActivity.class);
intent.putExtra("from_activity", "SourceActivity");
intent.putExtra("from_class", SourceActivity.class.getName());
startActivity(intent);

// 目標 Activity 判斷
String from = getIntent().getStringExtra("from_activity");
if ("SourceActivity".equals(from)) {
    // 執行特定邏輯
}

優點:清晰、可靠、不依賴反射或運行時類型檢查。

方法二:運行時檢查 Context 類型(僅適用於 Context 確為 Activity 實例)

if (context instanceof Activity) {
    Activity sourceActivity = (Activity) context;
    if (sourceActivity instanceof SourceActivity) {
        // 來源是 SourceActivity
    }
    // 或獲取類名
    String className = sourceActivity.getClass().getName();
}

缺點:若 Context 為 Application、Service 或 Wrapper(如 ContextThemeWrapper),轉型失敗;且無法區分同一 Activity 的不同實例。

方法三:自定義 Application 記錄當前 Activity(全域追蹤)

在 Application 子類中維護當前活躍 Activity 引用:

public class MyApp extends Application {
    private Activity currentActivity;
    public void setCurrentActivity(Activity activity) { this.currentActivity = activity; }
    public Activity getCurrentActivity() { return currentActivity; }
}

// BaseActivity onResume 中更新
@Override
protected void onResume() {
    super.onResume();
    ((MyApp) getApplication()).setCurrentActivity(this);
}

適用於需全域獲取當前 Activity 的場景,但需注意記憶體洩漏風險(使用 WeakReference)。

最佳實踐建議

  • 優先使用 Intent Extra 顯式傳遞:耦合度低、意圖明確、易於測試與維護。
  • 避免在工具類中強轉 Context 為 Activity,除非有充分理由且做好空值與類型檢查。
  • 若需跨組件通訊,考慮使用 EventBus、LiveData 或 BroadcastReceiver 解耦。
  • 記錄來源資訊時,建議傳遞類名(getClass().getName())而非簡單字串,便於反射與日誌分析。

總結:Context 本身不包含來源 Activity 資訊,最可靠的方式是在跳轉時通過 Intent 顯式傳遞來源標識。運行時類型檢查僅作為輔助手段,不可作為核心邏輯依賴。

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