B 應用無論從 Launcher 啟動還是從 A 應用啟動,進程相同 → static 全局變量共享 → 業務邏輯混淆(如登錄態、配置缓存)。
// A 應用啟動 B
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.b.package", "com.b.package.BActivity"));
intent.putExtra("from_app_a", true); // 標記來源
startActivity(intent);
// B 應用 BActivity.onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean fromA = getIntent().getBooleanExtra("from_app_a", false);
if (fromA) {
// 來自 A:保留全局狀態、跳過引導頁
} else {
// Launcher 直接啟動:清理全局變量、重新初始化
GlobalConfig.reset();
UserSession.clear();
}
}
<!-- B 應用 Manifest -->
<activity
android:name=".BActivity"
android:taskAffinity="com.b.package.from_a"
android:launchMode="singleTask" />
A 啟動時指定 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。不同 Affinity 會創建獨立任務棧,**但進程仍同一**,全局變量仍共享,需配合方案一清理。
<activity
android:name=".BActivity"
android:process=":from_a" />
init(context, fromA) / reset() 統一入口,避免散落業務代碼。singleTop + onNewIntent 處理多次來自 A 的喚醒。「同一進程全局共享」是 Android 基因。**Intent Extra 標記來源 + 入口統一初始化/重置** 是成本最低、可維護性最高的標準解法。