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

Android 從 A 應用啟動 B 應用並區分啟動源(避免全局變量污染)

     編輯:程式設計綜合問答

問題本質

B 應用無論從 Launcher 啟動還是從 A 應用啟動,進程相同 → static 全局變量共享 → 業務邏輯混淆(如登錄態、配置缓存)。

方案一:Intent Extra 標記啟動源(推薦)

// 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();
    }
}

方案二:TaskAffinity 隔離任務棧(進程級隔離)

<!-- 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" />
  • ✅ 進程不同 → 內存隔離 → 全局變量天然分離。
  • ⚠️ IPC 通信複雜(AIDL/Messenger/ContentProvider),Application 類會初始化兩次,內存佔用翻倍。
  • 適用場景:插件化、極高安全性插件、大內存模塊按需加載。

最佳實踐建議

  1. 優先方案一:成本最低、語義清晰、覆蓋 95% 場景。
  2. 全局變量封裝:提供 init(context, fromA) / reset() 統一入口,避免散落業務代碼。
  3. 啟動模式配合:singleTop + onNewIntent 處理多次來自 A 的喚醒。

總結

「同一進程全局共享」是 Android 基因。**Intent Extra 標記來源 + 入口統一初始化/重置** 是成本最低、可維護性最高的標準解法。

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