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

Android 在工具類中存取 MainActivity 變數的正確姿勢

     編輯:程式設計綜合問答

錯誤示範

// 工具類中
String uid = new MainActivity().uid; // ❌ 建立新實例,非原 Activity,資料為空或預設值

new MainActivity() 建立的是全新實例,與正在執行的 Activity 實例無關,且違背 Android 元件生命週期管理,極易導致記憶體洩漏或崩潰。

正解:static 欄位或單例模式

方案一:public static 欄位(最簡單)

// MainActivity.java
public class MainActivity extends AppCompatActivity {
    public static String CURRENT_UID; // 靜態欄位

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CURRENT_UID = "user_123"; // 登入後賦值
    }
}

// Tool.java 任意處存取
String uid = MainActivity.CURRENT_UID;

⚠️ 注意:靜態欄位隨進程存活,若進程被系統回收再重建,靜態值會重置。需在 onCreate 重新賦值或從 SharedPreferences 恢復。

方案二:Application 子類別持有全域資料(推薦)

// MyApp.java
public class MyApp extends Application {
    private String uid;
    public String getUid() { return uid; }
    public void setUid(String uid) { this.uid = uid; }
}

// AndroidManifest.xml
<application android:name=".MyApp" ...>

// 任意處存取
MyApp app = (MyApp) context.getApplicationContext();
String uid = app.getUid();

優點:生命週期贏過 Activity、不隨頁面銷毀、易於單元測試、符合單一職責原則。

方案三:SharedPreferences 持久化(跨進程/重啟保留)

// 寫入
context.getSharedPreferences("auth", MODE_PRIVATE).edit().putString("uid", uid).apply();

// 讀取
String uid = context.getSharedPreferences("auth", MODE_PRIVATE).getString("uid", "");

總結建議

場景推薦方案
臨時、進程內共享、不需持久化Application 子類別
需跨進程、重啟保留SharedPreferences / DataStore
極簡原型驗證static 欄位(加註釋警示)

切勿使用 new Activity() 存取資料,這是 Android 開發的大忌。

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