開發者常遇到需判斷 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)) {
// 執行特定邏輯
}
優點:清晰、可靠、不依賴反射或運行時類型檢查。
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 引用:
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)。
getClass().getName())而非簡單字串,便於反射與日誌分析。總結:Context 本身不包含來源 Activity 資訊,最可靠的方式是在跳轉時通過 Intent 顯式傳遞來源標識。運行時類型檢查僅作為輔助手段,不可作為核心邏輯依賴。