---
title: Forced Decision methods for the Android SDK
slug: feature-experimentation/docs/forced-decision-methods-android
docTags: 
createdAt: 2026-08-05T20:39:54.000Z
---

These methods help test and debug various flows of your client applications by forcing users into a specific variation.

The Android SDK checks if any Forced Decision methods were implemented before making any decisions. If a matching item is found for the requested flag, the SDK returns the forced decision immediately ([audience conditions](docId\:UDBvr5a8WHNkyOqzPhOr9) and traffic allocations are ignored) before making normal decisions.

The Android SDK checks for forced decisions at the start of each decision process. If a matching forced decision is found, it returns the decision immediately.

- **Flag-to-Decision** – The SDK checks at the start of any decide call for the given flag.
- **Experiment-Rule-to-Decision** – The SDK checks at the start of the decision for the given experiment rule of the flag key.
- **Delivery-Rule-to-Decision** – The SDK checks at the start of the decision for the given delivery rule of the flag key.

:::hint{type="danger"}
**Warning**
You must associate your variations to a [flag rule](docId:-yq2-thNRv7-SgwCXpG90) before calling any Forced Decision methods.
:::

On forced decisions, the Android SDK fires impression events and notifications just like other normal decisions (unless disabled by the [disableDecisionEvent](docId:0RRA0tqKb53_Evlvk1hNS)).

:::hint{type="info"}
**Note**
These forced decisions are not persistent and are cleared when the [OptimizelyUserContext](docId\:SPUvctrnEAYbsSJQuwWX9) is re-initialized.
:::

For information about each Forced Decision method, click on the method name.

- [\`setForcedDecision\`](docId\:lnQXcRTVM5OO_Yh9NaC9n)
- [\`getForcedDecision\`](docId\:lnQXcRTVM5OO_Yh9NaC9n)
- [\`removeForcedDecision\`](docId\:lnQXcRTVM5OO_Yh9NaC9n)
- [\`removeAllForcedDecisions\`](docId\:lnQXcRTVM5OO_Yh9NaC9n)

### OptimizelyDecisionContext

```kotlin
data class OptimizelyDecisionContext(val flagKey: String, val ruleKey: String?)
```

```java
public class OptimizelyDecisionContext {
   public OptimizelyDecisionContext(@Nonnull String flagKey, @Nullable String ruleKey);
  
   public String getFlagKey();
  
   public String getRuleKey();
}
```

### OptimizelyForcedDecision

```kotlin
data class OptimizelyForcedDecision(val variationKey: String)
```

```java
public class OptimizelyForcedDecision { 
   public OptimizelyForcedDecision(@Nonnull String variationKey);
  
   public String getVariationKey();
}
```

## Set Forced Decision method – `setForcedDecision()`

### Version

SDK v3.13.0 and higher

### Description

Sets a forced decision (`variationKey`) for a given `OptimizelyDecisionContext`.

### Parameters

This table lists the required and optional parameters for the Android SDK.

| Parameter                  | Type  | Description                                                                                                                                  |
| -------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **context** \*required\*   | Class | An instance of \`OptimizelyDecisionContext\` with the required \`flagKey\` and optional \`ruleKey\` for the forced decision you want to set. |
| **decision**\ \*required\* | Class | An instance of \`OptimizelyForcedDecision\` with the required \`variationKey\` for the forced decision you want to set.                      |

### Returns

A boolean value that indicates if setting the forced decision (`variationKey`) was completed.

### Example

See the full Android SDK example [in the Full code example section](docId\:lnQXcRTVM5OO_Yh9NaC9n).

## Get Forced Decision method – `getForcedDecision()`

### Version

SDK v3.13.0 and higher

### Description

Returns the forced decision (`variationKey`) for a given `OptimizelyDecisionContext`. Returns the `OptimizelyForcedDecision` instance or null if there is no matching item.

### Parameters

This table lists the required and optional parameters for the Android SDK.

| Parameter                | Type  | Description                                                                                                                                  |
| ------------------------ | ----- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **context** \*required\* | Class | An instance of \`OptimizelyDecisionContext\` with the required \`flagKey\` and optional \`ruleKey\` for the forced decision you want to get. |

### Returns

A forced decision `OptimizelyForcedDecision` instance for the context or null if there is no matching item.

### Example

See the full Android SDK example [in the Full code example section](docId\:lnQXcRTVM5OO_Yh9NaC9n).

## Remove Forced Decision method – `removeForcedDecision()`

### Version

SDK v3.13.0 and higher

### Description

Removes the forced decision (`variationKey`) for a given `OptimizelyDecisionContext`.

### Parameters

This table lists the required and optional parameters for the Android SDK.

| Parameters               | Type  | Description                                                                                                                                     |
| ------------------------ | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| **context** \*required\* | Class | An instance of \`OptimizelyDecisionContext\` with the required \`flagKey\` and optional \`ruleKey\` for the forced decision you want to remove. |

### Returns

A success or failure boolean status if the forced decision (`variationKey`) was removed.

### Example

See the full Android SDK example [in the Full code example section](docId\:lnQXcRTVM5OO_Yh9NaC9n).

## Remove all forced decisions method - `removeAllForcedDecisions()`

### Version

SDK v3.13.0 and higher

### Description

Removes all forced decisions (`variationKey`) for the user context.

### Parameters

This table lists the required and optional parameters for the Android SDK.

| Parameters | Type | Description |
| ---------- | ---- | ----------- |
| None       | N/A  | N/A         |

### Returns

A success or failure boolean status.

### Example

See the full Android SDK example [in the Full code example section](docId\:lnQXcRTVM5OO_Yh9NaC9n).

## Full code example

```kotlin
// Create the OptimizelyUserContext, passing in the UserId and Attributes
val user = optimizelyClient.createUserContext("user-id")

val flagContext = OptimizelyDecisionContext("flag-1", null)
val flagAndABTestContext = OptimizelyDecisionContext("flag-1", "exp-1")
val flagAndDeliveryRuleContext = OptimizelyDecisionContext("flag-1", "delivery-1")
val variationAForcedDecision = OptimizelyForcedDecision("variation-a")
val variationBForcedDecision = OptimizelyForcedDecision("variation-b")
val variationOnForcedDecision = OptimizelyForcedDecision("on")

// set a forced decision for a flag
var success = user!!.setForcedDecision(flagContext, variationAForcedDecision)
var decision = user.decide("flag-1")

// set a forced decision for an ab-test rule
success = user.setForcedDecision(flagAndABTestContext, variationBForcedDecision)
decision = user.decide("flag-1")

// set a forced variation for a delivery rule
success = user.setForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision)
decision = user.decide("flag-1")

// get forced variations
val forcedDecision = user.getForcedDecision(flagContext)
println("[ForcedDecision] variationKey = " + forcedDecision!!.variationKey)

// remove forced variations
success = user.removeForcedDecision(flagAndABTestContext)
success = user.removeAllForcedDecisions()
```

```java
/* Create the OptimizelyUserContext, passing in the UserId and Attributes */
OptimizelyUserContext user = optimizelyClient.createUserContext("user-id");

OptimizelyDecisionContext flagContext = new OptimizelyDecisionContext("flag-1", null);
OptimizelyDecisionContext flagAndABTestContext = new OptimizelyDecisionContext("flag-1", "exp-1");
OptimizelyDecisionContext flagAndDeliveryRuleContext = new OptimizelyDecisionContext("flag-1", "delivery-1");
OptimizelyForcedDecision variationAForcedDecision = new OptimizelyForcedDecision("variation-a");
OptimizelyForcedDecision variationBForcedDecision = new OptimizelyForcedDecision("variation-b");
OptimizelyForcedDecision variationOnForcedDecision = new OptimizelyForcedDecision("on");
        
// set a forced decision for a flag
Boolean success = user.setForcedDecision(flagContext, variationAForcedDecision);
OptimizelyDecision decision = user.decide("flag-1");

// set a forced decision for an ab-test rule
success = user.setForcedDecision(flagAndABTestContext, variationBForcedDecision);
decision = user.decide("flag-1");

// set a forced variation for a delivery rule
success = user.setForcedDecision(flagAndDeliveryRuleContext, variationOnForcedDecision);
decision = user.decide("flag-1");

// get forced variations
OptimizelyForcedDecision forcedDecision = user.getForcedDecision(flagContext);
System.out.println("[ForcedDecision] variationKey = " + forcedDecision.getVariationKey()); 

// remove forced variations
success = user.removeForcedDecision(flagAndABTestContext);
success = user.removeAllForcedDecisions();
```
