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

Android 拍照後在 Activity 間傳遞多張圖片:靜態 List 方案與最佳實踐

     編輯:程式設計綜合問答

需求:在 Activity A 拍攝 3 張照片,點擊「確認」跳轉至 Activity B 顯示或上傳。本文比較三種傳遞方式,推薦適用場景。

方案一:靜態 List 傳遞(快速原型、小圖片、單進程)

// 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。

方案二:儲存檔案 + 傳遞 Uri 路徑(健壯、支援大檔案、跨進程安全)

  1. 拍照時指定輸出檔案路徑(MediaStore.Images.Media.insertImage 或自建目錄)。
  2. Intent 傳遞 ArrayList<Uri> 或 ArrayList<String> 路徑。
  3. Activity B 以 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 級單例 / ViewModel / Room 資料庫(架構化專案)

  • 將圖片資料(或路徑)存入 Application 子類別的 List<String>、ViewModel 的 MutableLiveData,或寫入 Room 資料庫。
  • 符合 MVVM/MVI 架構,生命週期感知、配置變更不丟失。

選擇建議

場景推薦方案
Demo/原型、圖片小(<1MB)、單進程方案一(靜態 List)
正式專案、大圖、需跨進程/系統回收存活方案二(檔案+Uri)
已導入 MVVM/Jetpack、需生命週期感知方案三

記憶體管理提醒

  • Bitmap 極耗記憶體,顯示縮圖時請用 inSampleSize 或圖片載入庫縮放。
  • 不再需要時呼叫 bitmap.recycle()(API 19+ 自動管理,但手動釋放更保險)。
  • 靜態 List 方案務必在目標 Activity onDestroy 或取用後立即 clear()。

結語

Activity 間傳遞多張照片,**「存檔 + 傳 Uri」是最通用、最安全的做法**;靜態 List 僅適合快速驗證原型。正式上線專案請採用方案二或三,並善用圖片載入庫管理記憶體。

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