First of all, we need to add our first Fragment at the beginning, we should do it in the onCreate() method of our Activity:

if (null == savedInstanceState) {
      .replace(, FragmentA.newInstance(), "fragmentA")

Next, we need to manage our backstack. The easiest way is using a function added in our activity that is used for all FragmentTransactions.

public void replaceFragment(Fragment fragment, String tag) {
    //Get current fragment placed in container
    Fragment currentFragment = getSupportFragmentManager().findFragmentById(;

    //Prevent adding same fragment on top
    if (currentFragment.getClass() == fragment.getClass()) {

    //If fragment is already on stack, we can pop back stack to prevent stack infinite growth
    if (getSupportFragmentManager().findFragmentByTag(tag) != null) {
        getSupportFragmentManager().popBackStack(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE);

    //Otherwise, just replace fragment
            .replace(, fragment, tag)

Finally, we should override onBackPressed() to exit the application when going back from the last Fragment available in the backstack.

public void onBackPressed() {
    int fragmentsInStack = getSupportFragmentManager().getBackStackEntryCount();
    if (fragmentsInStack > 1) { // If we have more than one fragment, pop back stack
    } else if (fragmentsInStack == 1) { // Finish activity, if only one fragment left, to prevent leaving empty screen
    } else {

Execution in activity:

replaceFragment(FragmentB.newInstance(), "fragmentB");

Execution outside activity (assuming MainActivity is our activity):

((MainActivity) getActivity()).replaceFragment(FragmentB.newInstance(), "fragmentB");