Activity 間傳遞資料核心機制:Intent.putExtra(key, value) 存入,getIntent().getTypeExtra(key) 取出。支援基本型別、String、Parcelable、Serializable、陣列等。
// 發送端
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("user_id", 12345);
intent.putExtra("user_name", "張三");
intent.putExtra("is_vip", true);
intent.putExtra("scores", new int[]{90, 85, 88});
startActivity(intent);
// 接收端 (DetailActivity.onCreate)
Intent intent = getIntent();
int userId = intent.getIntExtra("user_id", -1); // 預設值 -1
String userName = intent.getStringExtra("user_name");
boolean isVip = intent.getBooleanExtra("is_vip", false);
int[] scores = intent.getIntArrayExtra("scores");
| 類型 | 存入方法 | 取出方法 | 備註 |
|---|---|---|---|
| byte | putExtra(key, val) | getByteExtra(key, def) | |
| short | putExtra(key, val) | getShortExtra(key, def) | |
| int | putExtra(key, val) | getIntExtra(key, def) | |
| long | putExtra(key, val) | getLongExtra(key, def) | |
| float | putExtra(key, val) | getFloatExtra(key, def) | |
| double | putExtra(key, val) | getDoubleExtra(key, def) | |
| boolean | putExtra(key, val) | getBooleanExtra(key, def) | |
| char | putExtra(key, val) | getCharExtra(key, def) | |
| String | putExtra(key, val) | getStringExtra(key) | 無預設值,可能回傳 null |
| CharSequence | putExtra(key, val) | getCharSequenceExtra(key) | |
| Parcelable | putExtra(key, val) | getParcelableExtra(key) | 高效、需實作 Parcelable |
| Serializable | putExtra(key, val) | getSerializableExtra(key) | 簡單但效能較差 |
| 陣列 | putExtra(key, array) | getTypeArrayExtra(key) | 如 getIntArrayExtra |
| Bundle | putExtra(key, bundle) | getBundleExtra(key) | 巢狀資料 |
@Parcelize
data class User(
val id: Long,
val name: String,
val email: String,
val isVip: Boolean
) : Parcelable
// 發送
intent.putExtra("user", user)
// 接收
val user = intent.getParcelableExtra("user")
Java 手寫 Parcelable 較繁瑣,建議用 @Parcelize (Kotlin) 或 AutoParcel/Parceler 庫。
Bundle bundle = new Bundle();
bundle.putInt("id", 1);
bundle.putString("name", "Test");
bundle.putParcelable("user", user);
intent.putExtras(bundle); // 或 intent.putExtra("bundle", bundle)
public static final String KEY_USER = "user"; 統一管理getIntExtra 讀 long 會截斷,務必對應getIntExtra(key, DEFAULT) 必填預設值ActivityResultContracts.StartActivityForResult:類型安全啟動並接收結果Safe Args:編譯期生成類型安全參數類別,強烈推薦新專案使用掌握 Intent Extra 完整類型支援與最佳實踐,能構建健壯的 Activity 間通訊。