04-5 태스크 관리 이해하기

앱은 하나의 프로세스 위에서 동작한다. 프로세스가 하나 실행되고 그 위에 VM(가상머신)이 만들어지며, 가상머신 위에서 앱이 실행된다.

우리가 만든 앱에서 전화 앱을 띄울 수도 있다. 이는 앱에서 시스템으로 인텐트를 보내는 방식으로 전화 앱을 띄웠다. 이렇게 하면 전화 앱은 별도의 프로세스로 동작하게 된다.

그런데 전화앱에서 뒤로가기 버튼을 누르면 원래 앱화면으로 돌아올 수 있어야한다. 그런데 프로세스는 독립적이라서 프로세스간 정보 공유는 어렵다.

그래서 Task(태스크)가 만들어 졌다. 태스크는 앱이 어떻게 동작할 지를 결정하는데 사용된다. 흐름을 관리할 수 있다.

프로세스와 태스크

하나의 프로세스에서 다른 프로세스의 화면을 띄우려면 시스템의 도움이 필요하다. 시스템에서 이런 액티비티의 각종 정보를 저장해두기 위해 태스크라는 것을 만들게 되었다.

우리가 만든 앱에서 전화 앱을 띄우지 않고 따로 실행시키면, 전화 앱과 우리 앱의 태스크는 별도로 만들어 진다.

시스템은 알아서 태스크를 관리하지만, 직접 제어해야 하는 경우도 있다.

매니페스트 파일에 액티비티를 등록할 때 태스크도 함께 설정할 수 있다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

MainActivity 가 중첩되어 열린다. 이 것은 매니페스트의 <activity> 태그에 launchMode=standard 로 설정한 것과 같다.

태스크는 새로 뜨는 화면을 차례대로 스택에 넣어서 관리한다.

launchMode=singleTop 으로 하면, 태스크 가장 위쪽에 있는 액티비티는 더 이상 새로 만들지 않게 된다.

이 경우 앞에서와 같이 MainActivity로 전달되는 인텐트는 onNewIntent()로 전달받아야한다.

launchMode=singleTask면 이 액티비티 생성되는 시점에 새로운 태스크를 만들고, launchMode=singleInstance로 설정하면 이 액티비티가 실행되는 시점에 새로운 태스크를 만들면서 이후에 실행되는 액티비티와는 태스크를 공유하지 않는다.

04-6 액티비티의 수명주기와 SharedPreferences 이해하기

안드로이드 시스템은 실행되는 앱의 상태를 직접 관리한다. 독립적인 앱이 시스템에 의해 관리되지 않으면, 실행된 앱이 메모리를 과도하게 점유하거나, 화면을 보여주는 권한을 과도하게 갖기 때문에, 전화기의 원래 기능인 전화 수신 또는 발신 기능을 사용하지 못할 수도 있다.

특히 안드로이드는 멀티태스킹을 지원하기 때문에 여러 앱이 동시에 실행되는 기능은 앱이 실행되는 환경을 시스템이 계속 모니터링 해야 할 필요가 있게 만든다.

하나의 액티비티가 화면에 보이거나 보이지 않게 되었을 때 다른 액티비티의 상태에 영향을 미칠 수 있다. 예를 들어 앱을 사용하던 중 전화가 오면 통화 앱이 화면에 나타나기 때문에 실행중이던 앱은 화면 뒤로 들어가 중지될 수 있다.

이처럼 액티비티는 처음 실행될 때 메모리에 만들어지는 과정부터, 실행, 중지, 메모리 해제의 여러 과정의 상태정보를 가지고 있으며, 이는 시스템이 관리하면서 각각의 상태에 해당하는 메소드를 자동으로 호출하게 된다.

기본 메소드인 onCreate() 메소드는 액티비티가 만들어질 때 시스템이 자동으로 호출하는 메소드이다.

액티비티의 대표적인 상태정보는 3가지가 있다.