태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

액티비티와 태스크(Task)

2009.09.20 04:59

액티비티는 같은 어플리케이션 내에 존재하는 액티비티 뿐만 아니라 다른 어플리케이션 내에 존재하는 액티비티까지호출할 수 있습니다. 일반적인 어플리케이션들은 각자 자신의 어플리케이션 내에 있는 구성요소들만 사용할수 있습니다. 따라서 특정 기능 (: 바코드 스캔 )을 자신의 어플리케이션에서 이용하려면 새로 그 역할을하는 컴포넌트를 구현해야 했죠. 하지만, 안드로이드는 특이하게도다른 어플리케이션 내의 컴포넌드들을 호출하여 마치 자신의 어플리케이션에서 사용하는 것이 가능합니다

만약, 제가 책을 관리하는 어플리케이션을 만들었다고 가정해 봅시다. 책을 관리하는 어플리케이션이면 책을 추가하는 기능이 있어야겠지요? 그런데책 정보를 일일이 입력하는 것은 손이 많이 가기에 책의 바코드를 인식하여 책 정보를 추가할 수 있게 하고 싶어합니다. 그런데 마침, 바코드를 스캔해주는 어플리케이션이 있네요? 그렇다면 이 어플리케이션을 이용하여 책의 바코드를 스캔하고, 받은정보를 이용하여 책을 추가해주는 것이 가능합니다

이렇게 한 어플리케이션에서 다른 어플리케이션의 컴포넌트를 거의 자유자재로 사용할 수 있다보니  파일의 구성으로만 보면 어플리케이션의 경계가뚜렷하지만, 실제로 어플리케이션이 실행되는 것을 보면 어플리케이션의 경계가 뚜렷하지 않습니다. 결국, 안드로이드 어플리케이션들 사이에는 경계가 없다고 할 수 있습니다

어플리케이션의 경계가 없어 여러 어플리케이션의 컴포넌트들을 호출하여 사용할 수 있다보니, 실질적으로 각 컴포넌트들, 특히나 화면에 표시되면서 사용자와 상호작용을하는 액티비티는 어플리케이션 단위가 아닌, 태스크(Task)를단위로 하여 관리됩니다

태스크(Task)는 사용자가 실질적으로 하나의 어플리케이션처럼느끼는 액티비티들의 집합이라 할 수 있습니다. 태스크는 스택(Stack) 형태로 구성되며, 스택의 가장 아래에는 이 태스크를 시작한 액티비티인 루트 액티비티(RootActivity)가 있으며, 그 후로 액티비티가 호출되게 되면 그 위에 액티비티가 하나씩쌓여가게 됩니다. 따라서, 태스크를 액티비티가 쌓여 있는스택이라 하여 액티비티 스택(Activity Stack)이라고도 합니다

정식 명칭은 태스크(Task)이지만,액티비티 스택이라는 용어가 더 개념상으로 정확한 표현이므로 지금부터의 설명에서는 태스크(Task) 보다는액티비티 스택(Activity Stack)이라는 용어를 더 많이 사용할테니, 혼동하지 마세요. ^^ 결국은 같은 뜻이에요~~ 

아무튼, 이러한 태스크는 메모리상에 동시에 여러 개가 존재할 수 있으며, 각각이독립적이므로 일반적으로 서로 영향을 주지 않습니다,


액티비티 스택(태스크)의 구조




루트 액티비티는 태스크를 시작한 액티비티이며, 대부분 이 액티비티들은 Application Launcher에서 선택되어 실행된 액티비티입니다. 처음 태스크가 시작되면, 태스크에는 루트 액티비티밖에 없습니다. 즉, 루트 액티비티가 액티비티 스택의 가장 위에 있게 되는데, 이렇게 액티비티 스택의 가장 위에 있는 액티비티는 화면에 표시되어 사용자와 상호작용을 수행할 수 있습니다. 이렇게 사용자와 상호작용을 수행하다가 다른 액티비티를 호출하게 되면 액티비티 스택에서 호출된 액티비티가 루트 액티비티의 위에 쌓이게 되고, 호출된 액티비티가 화면에 표시되면서 사용자와 상호작용을 수행하게 됩니다.

이렇게 호출을 거듭해나가다 보면 호출되었던 액티비티들이 액티비티 스택에 계속 순서대로 쌓이게 됩니다. 하지만, 무한정 액티비티를 호출만 하는 경우는 없습니다. 할 일(?)을 다 마쳤으면 이전 화면으로 돌아가야겠죠? 일반적으로 뒤로가기(Back) 키를 눌러 이전 화면으로 이동을 하는데, 이렇게 되면 액티비티 스택의 가장 위에 있던 액티비티는 액티비티 스택에서 사라지게 됩니다. 액티비티 스택에 액티비티가 쌓일 때 호출된 순서대로 쌓였다면, 사라지는 것은 당연히 그 반대 순서로 사라지게 되겠지요?

만약, 사용자가 뒤로가기 키가 아니라 Home 키를 누르게 되면 Home 화면에 뜨게 되고, 액티비티 스택에 저장되어 있던 액티비티들은 그 순서 그대로 저장되어 있게 됩니다. 그래서, Home 키를 눌렀다가 다시 아까 켜져있었던 어플리케이션을 실행시켜보면 Home키를 누르기 이전의 액티비티가 표시되고, 뒤로가기(Back) 키를 눌러보면 액티비티를 호출한 순서 그대로 액티비티 스택에 남아있는 것을 확인할 수 있습니다.




한번 간단히 확인해보도록 하죠. 기본 어플리케이션 중 Music 어플리케이션을 실행한 후, 아무 버튼이나 눌러 첫번째 액티비티, 즉 루트 액티비티가 아닌 다른 액티비티가 뜨게 합니다. 그 후, 홈 버튼을 눌렀다가 다시 Music 어플리케이션을 실행해 봅시다.




위와 같이 아까 우리가 Home 버튼을 눌렀던 때 화면에 떠있던 액티비티가 실행되는 것을 볼 수 있습니다. 여기에서 다시 뒤로가기(Back) 버튼을 누르면 Music 어플리케이션의 메인화면에 뜨는 것을 볼 수 있구요.

이렇게 해서 액티비티 스택, 즉 태스크(Task)에 대해 알아보았습니다. 위에서 설명한 것들은 별도로 옵션을 설정한 것이 아닌 기본 설정 그대로 액티비티를 실행한 것이며, 액티비티를 실행할 때 별도로 옵션을 지정하면 액티비티 스택에 남지 않게 액티비티를 실행하는 등 여러 가지 방법으로 액티비티를 호출하는 것이 가능합니다.

저작자 표시 비영리 변경 금지
신고

커니 어플리케이션 구성/액티비티(Activity) , , , , , , , , , ,

  1. Blog Icon
    강성현

    Task #2에서 Activity#4에서 Root Activity가면서 Root Activity 이외의 다른 Activity를 삭제 하려면 어떻게 하나요..

  2. 액티비티를 호출할 때 Flag를 다르게 설정해주면 됩니다.
    개발자 문서를 참조하세요.

  3. Blog Icon
    레드핫

    같은 어플리케이션의 액티비티를 호출하는 것은 쉽게 되는데
    다른 어플리케이션의 액티비티 호출은 어떻게 하는지 모르겠네요 ㅡㅠ
    그방법에 대해서 구체적으로좀 알고 싶습니다~~~^^

  4. 암시적 인텐트 (Implicit Intent)를 사용하시면 됩니다 :)

  5. Blog Icon

    비밀댓글입니다

  6. 바코드 인식을 위해 Zxing 라이브러리를 애플리케이션에 구현해도 되지만, 굳이 바코드 인식 기능을 애플리케이션 내에 내장하고 싶지 않다면 바코드 인식 기능을 외부 Barcode Scanner에 위임할 수 있습니다. 위의 글에서 설명하는 내용이 이에 해당하는 부분이죠.

    현재 바코드 스캐너 소스를 거의 가져오신 것 같은데, 그렇다면 그 소스 중에 바코드 스캔을 수행하는 액티비티의 소스가 있을 것입니다. 이는 바코드 스캐너 원본 애플리케이션의 소스코드 중 매니페스트(AndroidManifest.xml)에 정의되어 있죠.

    아무리 소스 파일이 많다 해도, 각 구성요소를 이루는 소스는 정해져 있기 마련이고, 이는 매니페스트를 보시면 알 수 있습니다.

    원본의 매니페스트를 보시고 바코드를 인식하는 액티비티가 무엇인지 알아보시면 될 듯 합니다. :)