diff --git a/res/values/strings.xml b/res/values/strings.xml
index 171fe42..805a1d2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10594,11 +10594,6 @@
     <!-- UI debug setting: preference summary - describes the behavior of forcing full raw GNSS satellite measurements [CHAR LIMIT=NONE] -->
     <string name="enable_gnss_raw_meas_full_tracking_summary">Track all GNSS constellations and frequencies with no duty cycling</string>
 
-    <!-- UI debug setting: preference title - allow background activity starts [CHAR LIMIT=60] -->
-    <string name="allow_background_activity_starts">Allow background activity starts</string>
-    <!-- UI debug setting: preference summary - describes the behavior of allowing background activity starts [CHAR LIMIT=NONE] -->
-    <string name="allow_background_activity_starts_summary">Allows all background activity starts</string>
-
     <!-- UI debug setting: preference title - show all crash dialogs [CHAR LIMIT=60] -->
     <string name="show_first_crash_dialog">Always show crash dialog</string>
     <!-- UI debug setting: preference summary - describes the behavior of showing a dialog every time an app crashes [CHAR LIMIT=NONE] -->
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index c537f3f..33dba2f 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -503,11 +503,6 @@
             android:title="@string/background_check_pref" />
 
         <SwitchPreference
-            android:key="allow_background_activity_starts"
-            android:title="@string/allow_background_activity_starts"
-            android:summary="@string/allow_background_activity_starts_summary" />
-
-        <SwitchPreference
             android:key="show_first_crash_dialog"
             android:title="@string/show_first_crash_dialog"
             android:summary="@string/show_first_crash_dialog_summary" />
diff --git a/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java b/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java
deleted file mode 100644
index 81efaa6..0000000
--- a/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceController.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development;
-
-import android.content.Context;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-
-import androidx.preference.Preference;
-import androidx.preference.SwitchPreference;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.development.DeveloperOptionsPreferenceController;
-
-public class AllowBackgroundActivityStartsPreferenceController
-        extends DeveloperOptionsPreferenceController
-        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
-
-    private static final String BACKGROUND_ACTIVITY_STARTS_ENABLED_KEY
-            = "allow_background_activity_starts";
-
-    /** Key in DeviceConfig that stores the default for the preference (as a boolean). */
-    @VisibleForTesting
-    static final String KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED =
-            "default_background_activity_starts_enabled";
-
-    public AllowBackgroundActivityStartsPreferenceController(Context context) {
-        super(context);
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return BACKGROUND_ACTIVITY_STARTS_ENABLED_KEY;
-    }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        writeSetting((boolean) newValue);
-        return true;
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        final int mode = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, -1);
-
-        boolean isEnabled = mode < 0 ? isDefaultEnabled() : mode != 0;
-        ((SwitchPreference) mPreference).setChecked(isEnabled);
-    }
-
-    @Override
-    protected void onDeveloperOptionsSwitchDisabled() {
-        super.onDeveloperOptionsSwitchDisabled();
-        clearSetting();
-        updateState(mPreference);
-    }
-
-    private void writeSetting(boolean isEnabled) {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, isEnabled ? 1 : 0);
-    }
-
-    private void clearSetting() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, -1);
-    }
-
-    private boolean isDefaultEnabled() {
-        // The default in the absence of user preference is settable via DeviceConfig.
-        // Note that the default default is disabled.
-        return DeviceConfig.getBoolean(
-                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
-                KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED,
-                /*defaultValue*/ false);
-    }
-}
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 9dcc222..5c97d58 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -472,7 +472,6 @@
         controllers.add(new ProfileGpuRenderingPreferenceController(context));
         controllers.add(new KeepActivitiesPreferenceController(context));
         controllers.add(new BackgroundProcessLimitPreferenceController(context));
-        controllers.add(new AllowBackgroundActivityStartsPreferenceController(context));
         controllers.add(new ShowFirstCrashDialogPreferenceController(context));
         controllers.add(new AppsNotRespondingPreferenceController(context));
         controllers.add(new NotificationChannelWarningsPreferenceController(context));
diff --git a/tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java
deleted file mode 100644
index 8165862..0000000
--- a/tests/robotests/src/com/android/settings/development/AllowBackgroundActivityStartsPreferenceControllerTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development;
-
-import static com.android.settings.development.AllowBackgroundActivityStartsPreferenceController.KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.provider.DeviceConfig;
-import android.provider.Settings;
-
-import androidx.preference.PreferenceScreen;
-import androidx.preference.SwitchPreference;
-
-import com.android.settings.testutils.shadow.ShadowDeviceConfig;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowDeviceConfig.class})
-public class AllowBackgroundActivityStartsPreferenceControllerTest {
-
-    @Mock
-    private SwitchPreference mPreference;
-    @Mock
-    private PreferenceScreen mPreferenceScreen;
-
-    private Context mContext;
-    private AllowBackgroundActivityStartsPreferenceController mController;
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
-        mController = new AllowBackgroundActivityStartsPreferenceController(mContext);
-        when(mPreferenceScreen.findPreference(mController.getPreferenceKey()))
-                .thenReturn(mPreference);
-        mController.displayPreference(mPreferenceScreen);
-    }
-
-    @Test
-    public void onPreferenceChange_settingEnabled_allowBackgroundActivityStartsShouldBeOn() {
-        mController.onPreferenceChange(mPreference, true /* new value */);
-
-        assertThat(getModeFroMSettings()).isEqualTo(1);
-    }
-
-    @Test
-    public void onPreferenceChange_settingDisabled_allowBackgroundActivityStartsShouldBeOff() {
-        mController.onPreferenceChange(mPreference, false /* new value */);
-
-        assertThat(getModeFroMSettings()).isEqualTo(0);
-    }
-
-    @Test
-    public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 0);
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(false);
-   }
-
-    @Test
-    public void updateState_settingEnabled_preferenceShouldBeChecked() {
-        Settings.Global.putInt(mContext.getContentResolver(),
-                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 1);
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(true);
-    }
-
-    @Test
-    public void updateState_settingReset_defaultDisabled_preferenceShouldNotBeChecked() {
-        setDefault(false);
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(false);
-    }
-
-    @Test
-    public void updateState_settingReset_defaultEnabled_preferenceShouldBeChecked() {
-        setDefault(true);
-        mController.updateState(mPreference);
-
-        verify(mPreference).setChecked(true);
-    }
-
-    @Test
-    public void onDeveloperOptionsSwitchDisabled_noDefault_shouldResetPreference() {
-        mController.onDeveloperOptionsSwitchDisabled();
-
-        verify(mPreference).setChecked(false);
-        verify(mPreference).setEnabled(false);
-
-        assertThat(getModeFroMSettings()).isEqualTo(-1);
-    }
-
-    @Test
-    public void onDeveloperOptionsSwitchDisabled_defaultDisabled_shouldResetPreference() {
-        setDefault(false);
-        mController.onDeveloperOptionsSwitchDisabled();
-
-        verify(mPreference).setChecked(false);
-        verify(mPreference).setEnabled(false);
-
-        assertThat(getModeFroMSettings()).isEqualTo(-1);
-    }
-
-    @Test
-    public void onDeveloperOptionsSwitchDisabled_defaultEnabled_shouldResetPreference() {
-        setDefault(true);
-        mController.onDeveloperOptionsSwitchDisabled();
-
-        verify(mPreference).setChecked(true);
-        verify(mPreference).setEnabled(false);
-
-        assertThat(getModeFroMSettings()).isEqualTo(-1);
-    }
-
-    private int getModeFroMSettings() {
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 999 /* default */);
-    }
-
-    private void setDefault(boolean defaultEnabled) {
-        DeviceConfig.setProperty(
-                DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
-                KEY_DEFAULT_BACKGROUND_ACTIVITY_STARTS_ENABLED,
-                Boolean.toString(defaultEnabled),
-                false /* makeDefault */);
-    }
-}
-
