04-4 플래그와 부가 데이터 사용하기

startActivity()startActivityForResult()를 여러번 호출하면 동일한 액티비티가 메모리에 여러 개 만들어질 것이다.

시스템이 인텐트 별로 새 액티비티를 띄워주기 때문이다.

중복된 액티비티를 띄우지 않으려면 플래그; Flag를 사용하면 조정할 수 있다.

플래그; Flag

일단 액티비티가 처리되는 방식을 이해해야 한다. 액티비티는 액티비티 매니저 클래스에 의해 액티비티 스택으로 관리된다.

액티비티를 스택형식으로 쌓아 두고, 가장 상위에 있던 액티비티가 없어지면 이전의 액티비티가 화면에 보이게 된다.

새로운 액티비티를 매니페스트에 등록하고, startAcitivity()startActivityForResult()메소드를 이용해서 실행하면, 이전에 있던 액티비티는 스택에 저장되고, 새로운 액티비티가 화면에 보인다.

동일한 액티비티를 여러번 실행하면 스택에 여러개가 쌓이고, 동시에 데이터를 여러번 접근하거나 리소스를 여러번 사용하느 문제가 발생한다.

플래그를 사용하여 해결할 수 있다. 대표적인 플래그는 아래와 같다.

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_NO_HISTORY

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_SINGLE_TOP 플래그는 액티비티를 생성할 때, 생성된 액티비티가 있으면 그 액티비티를 그대로 사용하라는 플래그이다.

화면에 액티비티가 새로 만들어지지 않고, 기존에 있는 것이 보이면 시스템에서 전달하는 인텐트 객체는 전달 받을 수 없다. startActivity()를 호출하는 액티비티(부모 액티비티)에서 전달하는 intent 는 새로 만들어진 액티비티의 onCreate()메소드 안에서 getIntent()로 참조할 수 있었지만, 액티비티가 재사용된다면 onCreate()메소드가 호출되지 않는다.

이 때, onNewIntent() 메소드를 재정의(오버라이딩)하면 액티비티가 새로 만들어지지 않았을 때 인텐트 객체만 전달 받을 수 있다.