1.【模擬面試追問|持久化與離線】 舊 App 送出「交接證明照片」的流程是這樣:
Service(onStartCommand 回傳 START_STICKY)。LiveData。LiveData,收到「完成」才呼叫業務 API,把網址清單交給後端。面試官依序問下面四個情境,每個都要回答三件事:
接著追問:
我的回答:(待補)
2.【預測再驗證|平台能力】 新版用 WorkManager 執行上傳:
@HiltWorker
class ProofUploadWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted params: WorkerParameters,
private val uploader: ProofUploader,
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result =
when (uploader.uploadNext()) {
UploadOutcome.Done -> Result.success()
UploadOutcome.NetworkError -> Result.retry()
UploadOutcome.Rejected -> Result.failure()
}
}
fun enqueueProofUpload(context: Context, proofId: String) {
val request = OneTimeWorkRequestBuilder<ProofUploadWorker>()
.setConstraints(Constraints(requiredNetworkType = NetworkType.CONNECTED))
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(context)
.enqueueUniqueWork("proof-$proofId", ExistingWorkPolicy.KEEP, request)
}
下面每個情境,先寫下你的預測:Worker 會不會執行?什麼時候執行?然後在實機上驗證。可以用 Android Studio 的 App Inspection(Background Task Inspector)或 adb shell dumpsys jobscheduler 觀察。品牌與 Android 版本可能影響結果,請寫下你測試用的機型和 Android 版本。
retry 之後,到「設定 → 應用程式」按「強制停止」,然後一小時都不打開 App。一小時後打開 App 呢?proofId 連續呼叫兩次 enqueueProofUpload,執行了幾個 Worker?把 KEEP 換成 REPLACE 再試一次:如果第二次呼叫時第一個正在上傳,它會怎樣?最後回答:依你驗證的結果,送出之後畫面要怎麼讓配送員知道「照片還沒傳完」?哪些情況一定要提醒使用者打開 App?
我的回答:(待補)