diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 0bf1255..714f3ee 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -201,6 +201,14 @@
         }
 
         @Override
+        public void onPause() {
+            super.onPause();
+            if (!getActivity().isChangingConfigurations() && !mWaitingForConfirmation) {
+                finish();
+            }
+        }
+
+        @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             final Activity activity = getActivity();
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index 800adb0..e74a2ff 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -219,6 +219,13 @@
         findViewById(R.id.content_parent).setFitsSystemWindows(false);
         getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
     }
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (!isChangingConfigurations()) {
+            finish();
+        }
+    }
 
     public static class ChooseLockPasswordFragment extends InstrumentedFragment
             implements OnEditorActionListener, TextWatcher, SaveAndFinishWorker.Listener {
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 20d1e7d..f0c432e 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -98,6 +98,14 @@
         return modIntent;
     }
 
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (!isChangingConfigurations()) {
+            finish();
+        }
+    }
+
     public static class IntentBuilder {
         private final Intent mIntent;
 
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
index e625827..a099a39 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -54,7 +54,9 @@
 import android.provider.Settings.Global;
 
 import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
 import androidx.preference.Preference;
+import androidx.test.core.app.ActivityScenario;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockscreenCredential;
@@ -613,15 +615,29 @@
                 mFragment.getString(R.string.face_unlock_set_unlock_password));
     }
 
+    @Test
+    public void activity_dismisses_InBackground() {
+        ActivityScenario<ChooseLockPassword> scenario =
+                ActivityScenario.launchActivityForResult(getChooseLockGenericIntent(null));
+        scenario.moveToState(Lifecycle.State.RESUMED);
+        scenario.moveToState(Lifecycle.State.CREATED);
+        assertThat(scenario.getResult()).isNotNull();
+    }
+
     private void initActivity(@Nullable Intent intent) {
+        final Intent theIntent = getChooseLockGenericIntent(intent);
+        // TODO(b/275023433) This presents the activity from being made 'visible` is workaround
+        mActivity = Robolectric.buildActivity(ChooseLockGeneric.InternalActivity.class, theIntent)
+                .create().start().postCreate(null).resume().get();
+        mActivity.getSupportFragmentManager().beginTransaction().add(mFragment, null).commitNow();
+    }
+
+    private Intent getChooseLockGenericIntent(@Nullable Intent intent) {
         if (intent == null) {
             intent = new Intent();
         }
         intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, false);
-        // TODO(b/275023433) This presents the activity from being made 'visible` is workaround
-        mActivity = Robolectric.buildActivity(ChooseLockGeneric.InternalActivity.class, intent)
-                .create().start().postCreate(null).resume().get();
-        mActivity.getSupportFragmentManager().beginTransaction().add(mFragment, null).commitNow();
+        return intent;
     }
 
     private static String capitalize(final String input) {
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java
index dea936d..ed8179b 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java
@@ -47,6 +47,9 @@
 import android.widget.CheckBox;
 import android.widget.TextView;
 
+import androidx.lifecycle.Lifecycle;
+import androidx.test.core.app.ActivityScenario;
+
 import com.android.internal.widget.LockscreenCredential;
 import com.android.settings.R;
 import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment;
@@ -515,16 +518,31 @@
         assertThat(pinAutoConfirmOption.isChecked()).isFalse();
     }
 
+    @Test
+    public void activity_dismisses_InBackground() {
+        ActivityScenario<ChooseLockPassword> scenario =
+                ActivityScenario.launchActivityForResult(getLockPasswordIntent());
+        scenario.moveToState(Lifecycle.State.RESUMED);
+        scenario.moveToState(Lifecycle.State.CREATED);
+        assertThat(scenario.getResult()).isNotNull();
+    }
+
     private ChooseLockPassword setupActivityWithPinTypeAndDefaultPolicy() {
         PasswordPolicy policy = new PasswordPolicy();
         policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
 
         return buildChooseLockPasswordActivity(
-                new IntentBuilder(application)
-                        .setUserId(UserHandle.myUserId())
-                        .setPasswordType(PASSWORD_QUALITY_NUMERIC)
-                        .setPasswordRequirement(PASSWORD_COMPLEXITY_NONE, policy.getMinMetrics())
-                        .build());
+                getLockPasswordIntent());
+    }
+
+    private Intent getLockPasswordIntent() {
+        PasswordPolicy policy = new PasswordPolicy();
+        policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
+        return new IntentBuilder(application)
+                .setUserId(UserHandle.myUserId())
+                .setPasswordType(PASSWORD_QUALITY_NUMERIC)
+                .setPasswordRequirement(PASSWORD_COMPLEXITY_NONE, policy.getMinMetrics())
+                .build();
     }
 
     private ChooseLockPassword buildChooseLockPasswordActivity(Intent intent) {
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
index 7715c62..da12ee4 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java
@@ -30,6 +30,9 @@
 import android.os.UserHandle;
 import android.view.View;
 
+import androidx.lifecycle.Lifecycle;
+import androidx.test.core.app.ActivityScenario;
+
 import com.android.internal.widget.LockPatternUtils;
 import com.android.internal.widget.LockscreenCredential;
 import com.android.settings.R;
@@ -137,16 +140,29 @@
                 R.string.lockpassword_draw_your_pattern_again_header));
     }
 
+    @Test
+    public void activity_dismisses_InBackground() {
+        ActivityScenario<ChooseLockPattern> scenario =
+                ActivityScenario.launchActivityForResult(getLockPatternIntent(false));
+        scenario.moveToState(Lifecycle.State.RESUMED);
+        scenario.moveToState(Lifecycle.State.CREATED);
+        assertThat(scenario.getResult()).isNotNull();
+    }
+
     private ChooseLockPattern createActivity(boolean addFingerprintExtra) {
         return Robolectric.buildActivity(
-                ChooseLockPattern.class,
-                new IntentBuilder(application)
-                        .setUserId(UserHandle.myUserId())
-                        .setForFingerprint(addFingerprintExtra)
-                        .build())
+                        ChooseLockPattern.class,
+                        getLockPatternIntent(addFingerprintExtra))
                 .setup().get();
     }
 
+    private Intent getLockPatternIntent(boolean addFingerprintExtra) {
+        return new IntentBuilder(application)
+                .setUserId(UserHandle.myUserId())
+                .setForFingerprint(addFingerprintExtra)
+                .build();
+    }
+
     private LockscreenCredential createPattern(String patternString) {
         return LockscreenCredential.createPattern(LockPatternUtils.byteArrayToPattern(
                 patternString.getBytes()));
