// 發送端
ArrayList<String> players = new ArrayList<>();
players.add(text);
Intent intent = new Intent(this, Igra.class);
intent.putStringArrayListExtra("players", players);
startActivity(intent);
// 接收端
ArrayList<String> players = data.getStringArrayListExtra("players"); // data 未定義 → 編譯錯誤
createNewTextView 創建新 Intent 又未用於啟動)。data 未聲明,應用 getIntent()。// 1. 成員變量持有數據源
private ArrayList<String> players = new ArrayList<>();
private TextView createNewTextView(String text) {
TextView tv = new TextView(this);
tv.setText(text);
players.add(text); // 累加到成員列表
return tv;
}
public void zacniIgro(View v) {
// 2. 同一 Intent 實例攜帶數據並啟動
Intent intent = new Intent(this, Igra.class);
intent.putStringArrayListExtra("players", players);
startActivity(intent);
}
// Igra.java 接收端
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_igra);
// 3. 直接從啟動 Intent 獲取
ArrayList<String> players = getIntent().getStringArrayListExtra("players");
if (players != null) {
// 更新 UI、RecyclerView 等
}
}
String 列表直接支持;自定義類需實現 Parcelable(推薦)或 Serializable:
@Parcelize // Kotlin 一鍵生成
data class Player(var name: String, var age: Int) : Parcelable
// Java 手寫 Parcelable 或用插件生成
intent.putParcelableArrayListExtra("players", playerList);
// 接收
ArrayList<Player> list = getIntent().getParcelableArrayListExtra("players");
| 方案 | 適用閾值 | 優點 | 缺點 |
|---|---|---|---|
| Intent Extra | < 100KB / 幾百條 | 簡單、進程間自動序列化 | Binder 緩衝區限制 (~1MB),超限崩潰 |
| SharedPreferences / DataStore | 持久化配置 | 跨進程可讀、應用重啟保留 | 主線程 IO、不適合高頻大數據 |
| Application 類單例 / 靜態緩存 | 進程內共享 | 零序列化、極快 | 進程被殺數據丟失、內存洩漏風險 |
| Room / SQLite / FileProvider | 大數據/結構化/跨應用 | 查詢靈活、持久可靠 | 代碼量大、需異步 |
Activity 傳列表:**成員變量累加數據 → 同一 Intent putExtra → startActivity → getIntent() 取出**。超大數據改用本地持久化或單例緩存。