調用系統相機或第三方相機(如美顏相機)拍照後,約 20% 機率導致 App 閃退,無錯誤日誌,onActivityResult 似乎執行到 `return` 即消失,成員變數變 `null`,連 `UncaughtExceptionHandler` 都捕捉不到。
**拍照過程中原 Activity 進程被系統殺死回收記憶體**。第三方相機佔用大量記憶體,觸發 Low Memory Killer,導致宿主應用進程被終止。系統重新啟動 Activity 時,成員變數(含儲存照片路徑的 `tempPhotoPath`)重置為初始值(`null`),而開發者代碼未處理此情況,直接使用 `null` 導致崩潰。
// 拍照前
String photoPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/IMG_" + System.currentTimeMillis() + ".jpg";
File photoFile = new File(photoPath);
Uri photoUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
// onActivityResult
if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
// 直接使用 photoFile 或 photoUri,不依賴成員變數
Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getAbsolutePath());
// ...
}
理解「進程被殺死重建」是 Android 生命週期核心,妥善保存/恢復狀態才能避免此類「詭異閃退」。