액티비만 사용할 때, 프래그먼트만 사용할 때, 두 가지를 복합적으로 사용할 때 모두 백스택의 동작이 다르게 됙기 때문에, 당연히 그럴 수 밖에 없습니다. 짊문을 보면 마치 액티비티 2개를 왔다갔다 하는데 생기는 문제로 보입니다.
먼저 프래그먼트의 백스택이 어떻게 관리되는지 lifecycle이 어떻게 되는지에 대한 기본적인 내용은 알고 가셔야 프래그먼트를 큰 문제없이 사용하실 수 있습니다. 질문 내용으로 봐서는 이 점에 대한 이해가 거의 없으셔서 생기는 의문사항으로 보입니다.
아래 개발자 문서를 먼저 정독해 보시길 권장합니다.
https://developer.android.com/guide/fragments
간단하게 설명을 드리면, 프래그먼트를 백스택에 추가(push)하게 되면, 백키를 누를 때 마다 백스택에 쌓여있던 프래그먼트가 튀어나오게 (pop)게 됩니다. 예를 들면, MainActivity에 A 그리고 B 프래그먼트를 추가하면, 백스택에는 아래처럼 쌓엑 됩니다.
MainActivity
B
___
A
이 때 백키를 누르면, 백스택은 stack이므로 맨위에 있는 B가 나오게 되고, 다시 백키를 누르면 A가 나오게 됩니다. 다시 백키를 누르면 화면에 아무 것도 남지 않고, 다시 백키를 누르면 A를 XML 컴파일타임에 fragment로 추가했을 경우는, 빈화면이 나오지 않고 바로 MainActivity가 종료되고, FragmentManager를 통해 추가한 경우는 빈화면이 나오고 다시 백키를 누를 때 MainActivity가 종료됩니다.
따라서 FragmentManager를 통해 A를 추가했다면, 백스택에 프래그먼트가 남아 있는지 체크해서 없으면 종료를 시켜주셔야 합니다. 만약 이 부분을 커스터마이즈 하고 싶으면 MainActvity의 onBackPressed를 오버라이드 하거나
public class MainActivity extends AppCompatActivity {
// ...
@Override
public void onBackPressed() {
// Get the FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
// Check if there are any Fragments on the back stack
if (fragmentManager.getBackStackEntryCount() > 0) {
// If there are, pop the back stack to remove the Fragments
fragmentManager.popBackStack();
} else {
// If there aren't, finish the Activity to close the app
finish();
}
}
// ...
}
한번에 프래그먼트들을 백스택에서 제거하고 싶다면 popBackStack 메소드를 사용하시면 됩니다.
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
프래그먼트 백스택 변경에 대한 처리가 필요하시면 FragmentManager.OnBackStackChangedListener를 사용하시면 됩니다.
public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportFragmentManager().addOnBackStackChangedListener(this);
}
@Override
public void onBackStackChanged() {
}
}
프래그먼트는 복잡한 컴포넌트입니다. 기본적인 사항을 충분히 숙지하시는게 좋습니다.