// 工具類中
String uid = new MainActivity().uid; // ❌ 建立新實例,非原 Activity,資料為空或預設值
new MainActivity() 建立的是全新實例,與正在執行的 Activity 實例無關,且違背 Android 元件生命週期管理,極易導致記憶體洩漏或崩潰。
// 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 恢復。
// 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、不隨頁面銷毀、易於單元測試、符合單一職責原則。
// 寫入
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 開發的大忌。