需求:在 Activity A 拍攝 3 張照片,點擊「確認」跳轉至 Activity B 顯示或上傳。本文比較三種傳遞方式,推薦適用場景。
// Activity A (拍照頁)
public class PhotoActivity extends AppCompatActivity {
public static List<Bitmap> photoList = new ArrayList<>(); // 靜態持有
private void onPhotoTaken(Bitmap bitmap) {
photoList.add(bitmap);
}
private void goToConfirm() {
startActivity(new Intent(this, ConfirmActivity.class));
}
}
// Activity B (確認頁)
public class ConfirmActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
List<Bitmap> photos = PhotoActivity.photoList; // 直接取用
PhotoActivity.photoList.clear(); // 用完清空,避免記憶體洩漏
// 顯示 photos...
}
}
優點:程式碼極簡、物件不序列化、效能最好。
缺點:進程被系統回收時靜態變數會清空,導致資料遺失;大圖片易 OOM。
MediaStore.Images.Media.insertImage 或自建目錄)。ArrayList<Uri> 或 ArrayList<String> 路徑。BitmapFactory.decodeFile 或 Glide/Picasso 載入顯示。// A 拍照存檔
File photoFile = createImageFile();
Uri photoUri = FileProvider.getUriForFile(this, AUTHORITY, photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
// A 收集多張 Uri
ArrayList<Uri> uris = new ArrayList<>();
uris.add(photoUri1); uris.add(photoUri2); uris.add(photoUri3);
Intent i = new Intent(this, ConfirmActivity.class);
i.putParcelableArrayListExtra("photo_uris", uris);
startActivity(i);
// B 接收
ArrayList<Uri> uris = getIntent().getParcelableArrayListExtra("photo_uris");
Application 子類別的 List<String>、ViewModel 的 MutableLiveData,或寫入 Room 資料庫。| 場景 | 推薦方案 |
|---|---|
| Demo/原型、圖片小(<1MB)、單進程 | 方案一(靜態 List) |
| 正式專案、大圖、需跨進程/系統回收存活 | 方案二(檔案+Uri) |
| 已導入 MVVM/Jetpack、需生命週期感知 | 方案三 |
inSampleSize 或圖片載入庫縮放。bitmap.recycle()(API 19+ 自動管理,但手動釋放更保險)。onDestroy 或取用後立即 clear()。Activity 間傳遞多張照片,**「存檔 + 傳 Uri」是最通用、最安全的做法**;靜態 List 僅適合快速驗證原型。正式上線專案請採用方案二或三,並善用圖片載入庫管理記憶體。