diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt
index f126a9aabf17a19f1bfa19240b7aa96a85e38d30..2e0864f486d06d7b5d1e81da39c526bff454f0bb 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt
@@ -32,6 +32,8 @@ import androidx.lifecycle.lifecycleScope
 import androidx.navigation.NavController
 import androidx.navigation.fragment.NavHostFragment
 import dagger.hilt.android.AndroidEntryPoint
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.isActive
 import kotlinx.coroutines.launch
 import org.briarproject.android.dontkillmelib.DozeUtils.needsDozeWhitelisting
 import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalClockSkewFragment
@@ -158,9 +160,15 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult>
         }
     }
 
+    // Remember last db check job so that we can cancel the current one and launch a new one in case
+    // of onCreate() and onNewIntent() creating two jobs in quick succession.
+    private var lastDbCheck: Job? = null
+
     private fun checkForDbAsync() {
-        lifecycleScope.launch {
+        lastDbCheck?.cancel()
+        lastDbCheck = lifecycleScope.launch {
             val hasDb = viewModel.hasDb()
+            if (!isActive) return@launch
             LOG.info(
                 "hasDb? $hasDb, hadBeenStartedOnSave? $hadBeenStartedOnSave, " +
                     "onboarding launched? $onboardingLaunched, onboarding done? $onboardingDone"
@@ -188,7 +196,8 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult>
         if (!hasDb && !onboardingDone) {
             // Make sure not to launch onboarding twice. In case of MainActivity being killed (due
             // to do-not-keep activities option enabled), onDbChecked() gets called twice when
-            // relaunched via app launcher (through onNewIntent()).
+            // relaunched via app launcher (through onNewIntent()). Even though we cancel the job
+            // there is a slight chance that both jobs finish.
             if (!onboardingLaunched.getAndSet(true)) {
                 LOG.info("launching onboarding activity")
                 startForResult.launch(Intent(this, OnboardingActivity::class.java))