인텐트
화면을 실행하는 일은 안드로이드 시스템에서 담당합니다.
그리고 인텐트는 시스템으로 전달되는 일종의 명령을 담고 있는 객체입니다.
시스템이 이해할 수 있는 객체를 하나 만들어둔 거죠.
이 인텐트 안에 들어있는 명령이나 데이터를 시스템에서 이해한 후에 시스템이 어떤 일을 해주게 되는데, 애플리케이션 구성요소들은 시스템에서 관리하므로 화면뿐만 아니라 나중에 배우게 될 서비스나 브로드캐스트 리시버의 경우에도 인텐트를 이용해 정보를 주고 받게 됩니다.
인텐트 안에 들어가는 정보 중에서 가장 중요한 것은 액션 정보입니다.
전화걸기를 시스템에 요청할 때는 ACTION_VIEW나 ACTION_DIAL 액션을 넣어줄 수 있는데 이렇게 하면 시스템에서 어떤 동작을 원하는지 이해할 수 있습니다.
전화걸기를 원하는 인텐트는 다음과 같이 사용됩니다.
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:01010001000"));
startActivity(intent);
이전 시간에 만들었던 메뉴 액티비티를 띄우고 싶다면 MenuActivity.class 라는 클래스 인스턴스를 인텐트의 파라미터로 넘겨주는 방법과 그 외에도 ComponentName 객체를 만들어 설정하는 방법이 있습니다.
Intent intent = new Intent();
ComponentName name = new ComponentName("org.techtown.intent",
"org.techtown.intent.MenuActivity");
intent.setComponent(name);
startActivityForResult(intent, 101);
패키지의 이름까지 넣어주어야 하니 좀 더 복잡해 보이지만 실행하고 싶은 액티비티를 문자열로만 지정할 수 있어서 동적으로 액티비티를 지정해주고 싶을 때 사용할 수 있습니다.
액티비티를 위한 플래그
메인 액티비티에서 메뉴 액티비티를 실행하는 경우 액티비티에서 시스템을 통해 다른 액티비티를 실행하는 형태가 됩니다.
그런데 화면이 없는 서비스라는 것에서 액티비티를 실행하는 경우도 있습니다.
이 때는 액티비티를 새로 만들어 실행할 수도 있지만 이미 사용자가 보고 있는 액티비티 위에 액티비티를 실행하게 되는 경우가 생길 수도 있습니다.
결국 동일한 액티비티인데 두 개가 만들어지게 되고 가장 위에 있는 것만 보이는 상황이 만들어지는 거죠.
이 때 맨 위에 있는 액티비티를 finish 메소드로 없애더라도 사용자에게는 동일한 모양의 화면이 다시 보이게 되는 문제가 발생합니다.
이런 경우에 플래그를 사용하면 동일한 액티비티인 경우 이미 화면에 보이는 액티비티를 그대로 사용할 수 있도록 해 줍니다.
대표적으로 사용되는 플래그 중의 하나가 FLAG_ACTIVITY_SINGLE_TOP 인데 다음과 같이 플래그를 사용할 때와 사용하지 않을 때를 비교해볼 수 있습니다.
새로 실행하려는 액티비티와 화면에 보이는 액티비티가 동일한 액티비티인 경우 메모리에 새로 만들지 않고 화면에 보이는 액티비티를 그대로 보여줍니다.
그런데 이미 만들어져서 화면에 보이고 있는 액티비티를 그대로 사용므로 onCreate 메소드가 호출되지 않습니다.
onCreate 메소드는 액티비티가 메모리에 처음 만들어질 때 자동으로 호출되는데 화면이 이미 만들어져 있으니 호출되지 않는 거죠.
이때는 onNewIntent 라는 메소드가 호출됩니다.
이 메소드가 별도로 호출되는 이유는 인텐트를 전달받기 위해서입니다.
onCreate가 호출되는 경우에는 그 안에서 getIntent 메소드를 이용해 전달받은 인텐트 객체를 확인할 수 있지만 onCreate 메소드가 호출되지 않는 경우에는 onNewIntent 메소드 안에서 인텐트 객체를 확인할 수 있도록 합니다.
최근댓글