Tag Archives: Task

[Android] Activity 생성시에 사용되는 Intent Flag 정리

안드로이드 엑티비티에 대해 이해하기 위해 필요한 지식은 3가지 정도가 아닐까 생각합니다. 바로 Activity Lifecycle, Task, Intent 입니다. 모두 어느정도 이해를 하시고 계신 상태라고 생각하고 글을 적어보겠습니다.

인텐트를 이용하여 새로운 엑티비티를 띄우기 위해서는 일반적으로 다음과 같은 방법으로 새로운 엑티비티를 실행하게 됩니다.

Intent intent = new Intent(this, MyActivity.class);
startActivity(intent);

위의 코드는 다음과 같은 순서로 실행이 됩니다.

1. 새로운 MyActivity 인스턴스가 생성됩니다.
2. 이 인스턴스가 현재 태스크 스택의 최상단에 푸시가 됩니다.
3. 엑티비티가 시작되며(onStart) 포그라운드로 가져옵니다.

하지만 위와 같은 인텐트 생성에 관련된 기본적인 실행 방법을 인텐트 플래그를 사용하여 임의로 조정할 수 있습니다.

intent.addFlag(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

위와 같은 방법을 통해 특정한 플래그 옵션값을 startActivity(intent)가 수행될때 같이 넘겨줄 수 있습니다. 지금부터 이러한 플래그 옵션값들을 좀더 상세기 적어보도록 하겠습니다.

FLAG_ACTIVITY_BROUGHT_TO_FRONT

이 플래그는 사용자가 설정하는것이 아닌 시스템에 의해 설정되는 값입니다. 엑티비티의 실행모드가 singleTask이고 이미 엑티비티스택에 존재하고 있는 상태라고 가정을 할 때 다시 그 엑티비티가 호출되고 재활용 되었을 경우 자동으로 설정이 됩니다.

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
사용자 삽입 이미지이 플래그를 사용하면 태스크가 리셋될때 플래그가 사용된 엑티비티부터 최상단의 엑티비티까지 모두를 삭제합니다. 리셋은 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 플래그에 의해 실행이 되는데 시스템에 의해 홈스크린에서 사용자에 의해 백그라운드에 있던 태스크가 포그라운드로 전환될때에 항상 붙게 됩니다.

위의 그림에서 볼 수 있듯이 백그라운드와 포그라운드 전환관계에서 CLEAR_WHEN_TASK_RESET 플래그가 설정된 엑티비티와 이후의 엑티비티 모두가 삭제되는것을 알 수 있습니다. 백그라운드로 넘어갔을때 유지를 안해도 될 일회성 엑티비티들은 해당 플래그를 사용하면 도움이 될것이라 봅니다.

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

이 플래그는 인텐트를 이용하여 새로운 태스크를 생성하거나 존재하고 있는 태스크를 포그라운드로 가져오는 경우가 아닌경우에는 사용하여도 아무런 효과가 없습니다. 적절한 경우라면 태스크를 리셋 합니다. 이때에 태스크의 affinity 설정에 맞추어 리셋이 일어나게 되며 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET과 같은 플래그 설정에 맞추어진 특정 처리가 일어나게 됩니다.

FLAG_ACTIVITY_CLEAR_TOP
사용자 삽입 이미지만약에 엑티비티스택에 호출하려는 엑티비티의 인스턴스가 이미 존재하고 있을 경우에 새로운 인스턴스를 생성하는 것 대신에 존재하고 있는 엑티비티를 포그라운드로 가져옵니다. 그리고 엑티비티스택의 최상단 엑티비티부터 포그라운드로 가져올 엑티비티까지의 모든 엑티비티를 삭제합니다.

예를 들면 현재 ABCDE순서로 엑티비티가 스택에 들어있다고 할때 엑티비티E에서 C를 호출하게 되면 D와 E는 스택에서 삭제되고 ABC만이 남아있게 됩니다. 여기서 AB 역시 남는다는 것을 이해하셔야 합니다.

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

엑티비티가 새로운 태스크안에서 실행될때에 일반적으로 타겟 엑티비티는 ‘최근 실행된 엑티비티’ 목록에 표시가 됩니다. (이 목록은 홈버튼을 꾹 누르고 있으면 뜹니다) 이 플래그를 사용하여 실행된 엑티비티는 최근실행된엑티비티 목록에서 나타나지 않습니다.

FLAG_ACTIVITY_FORWARD_RESULT

기본적으로 엑티비티A가 엑티비티B를 호출하였다고 할 경우 startActivity(intent) 대신에 startActivityForResult(intent) 메서드를 이용하여 호출을 함으로써 엑티비티B의 결과값을 엑티비티A로 전달할 수 있습니다.

엑티비티B에서는 setResult(int resultCode)를 정의한 뒤에 종료를 하게 되며 엑티비티B를 호출하였던 엑티비티A는 콜백메서드인 onActivityResult()를 통해 결과값을 전달받게 됩니다.
사용자 삽입 이미지이제 엑티비티B가 또다른 엑티비티C를 호출하였다고 가정해 봅시다. 그리고 이렇게 호출된 엑티비티C에서 엑티비티A까지 전달할 결과값을 정의하였습니다. 이 결과값을 B에서 A로 또다른 코드를 통해서 프로그래머의 코드를 통해서 값을 전달하는 번거로움을 피하기 위해 안드로이드에서는 이 인텐트 플래그값을 제공합니다.

위에 나와있는 그림의 예를 통해 보면 엑티비티B가 엑티비티C를 호출하기위해 단순히 startActivity()를 이용하는 것을 알 수 있습니다. 그리고 지금 설명중인 플래그를 붙이도록 합니다. 이후에 엑티비티C에서는 setResult()를 통해 결과값을 정의를 한후에 finish()를 통해 엑티비티를 종료하도록 합니다.

엑티비티B에서는 단순히 마찬가지로 finish()를 통해 엑티비티를 종료하시기만 하면 됩니다. 이후에 startActivityForResult()를 통해 엑티비티B를 호출했던 엑티비티A는 onActivityResult() 콜백 메서드로 결과값을 받아보시면 엑티비티C에서 정의한 값을 받을 수 있다는것을 알 수 있습니다.

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

이 엑티비티 플래그는 시스템에 의하여 자동으로 설정되는 플래그입니다. 홈스크린화면에서 홈버튼을 롱클릭함으로써 뜨게 되는 “최근실행목록”을 통해 실행되었을 경우 자동으로 설정됩니다.

FLAG_ACTIVITY_MULTIPLE_TASK

이 엑티비티 플래그는 FLAG_ACTIVITY_NEW_TASK와 함께 사용하지 않으면 아무런 효과가 없는 플래그입니다. 두개의 플래그를 동시에 사용할 경우 새로운 태스크는 재활용되지 않고 무조건 새로 생성되며 피호출되는 엑티비티는 이 새로운 태스트의 최상위 엑티비티가 됩니다. (당연히 하나밖에 없을테니-_-a)

FLAG_ACTIVITY_NEW_TASK

이 엑티비티 플래그를 사용하여 엑티비티를 호출하게 되면 새로운 태스크를 생성하여 그 태스크안에 엑티비티를 추가하게 됩니다. 단, 기존에 존재하는 태스크들중에 생성하려는 엑티비티와 동일한 affinity를 가지고 있는 태스크가 있다면 그곳으로 새 엑티비티가 들어가게됩니다.

하나의 어플리케이션안에서는 모든 엑티비티가 기본 affinity를 가지고 같은 태스크안에서 동작하는것이 기본적(물론 변경이 가능합니다)이지만 FLAG_ACTIVITY_MULTIPLE_TASK 플래그와 함께 사용하지 않을경우 무조건적으로 태스크가 새로 생성되는것은 아님을 주의하셔야 합니다.

FLAG_ACTIVITY_NO_ANIMATION

안드로이드 OS가 2.0으로 올라오면서 새로 추가된 엑티비티 플래그입니다. 이 플래그를 사용할 경우 엑티비티가 스크린에 등장할시에 사용될 수 있는 다양한 애니메이션 효과를 사용하지 않습니다.

FLAG_ACTIVITY_NO_HISTORY

이 플래그를 사용할 경우 새로 생성되는 엑티비티는 어떤 태스크에도 보존되지 않게 됩니다. 예를 들면 로딩화면과 같이 다시 돌아오는것이 의미가 없는 화면이라면 이 플래그를 사용하여 태스크에 남기지 않고 자동적으로 화면이 넘어감과 동시에 제거할 수 있습니다.

FLAG_ACTIVITY_NO_USER_ACTION

이 플래그가 설정되면 자동적으로 엑티비티가 호출될 경우에 자동 호출되는 onUserLeaveHint()가 실행되는것을 차단합니다. onUserLeaveHint() 콜백 메서드는 어플리케이션 사용중에 전화가 온다거나 하는등의 사용자의 액션없이 엑티비티가 실행/전환되는 경우에 호출되는 메서드입니다.

FLAG_ACTIVITY_REORDER_TO_FRONT
사용자 삽입 이미지호출하려던 엑티비티가 이미 엑티비티 스택에 존재하고 있다면 이 플래그를 사용하여 스택에 존재하는 엑티비티를 최상위로 끌어올려줍니다. 결과적으로 엑티비티 스택의 순서가 재정렬되는 효과를 가집니다. 위의 예를 볼 경우에 엑티비티E가 C를 호출하게 됨으로써 엑티비티C가 최상단으로 이동하는 결과를 확인하실 수 있습니다.

FLAG_ACTIVITY_SINGLE_TOP

이 플래그는 말그대로 하나의 탑(?)을 의미하는 설정입니다. 엑티비티를 호출할 경우 호출된 엑티비티가 현재 태스크의 최상단에 존재하고 있었다면 새로운 인스턴스를 생성하지 않습니다. 예를 들어 ABC가 엑티비티 스택에 존재하는 상태에서 C를 호출하였다면 여전히 ABC가 존재하게 됩니다.

Trac과 Eclipse Mylin 연동하기

이번에는 Trac과 Eclipse의 Mylin을 연동하여 환상의 협업 시스템을 구성하는 방법을 알아보겠습니다.

사실 환상은 좀 오버지만 중소규모의 회사에서 도입하면 분명히 좋을것이라 생각되는 내용입니다.

시작하기 전에 Trac을 아직 설치 하지 못하신 분들은 다음을 참고하시기 바랍니다.



Mylin에서 Trac을 지원합니다만 0.9 ~ 0.10 버젼을 지원합니다. 이번에 0.11 버젼이 새롭게 나왔던데 그냥 0.10버젼을 사용하시는게 좋을 것 같습니다.

Mylin과 Trac은 웹방식과 XML-RPC방식의 두가지 방식을 지원합니다. 위의 제가 써놓은 강좌를 따라하셨다면 웹방식으로 연결될 것입니다.

티켓을 발행하거나 읽을 때 웹 브라우저가 떠서 웹상에서 티켓을 발행하고 처리해야 하죠. 막상 해보면 별로 멋도 없고 버그질라와 연동했을때에 비해 효율성이 떨어지는 느낌입니다.

방법이 없을까 하고 찾아보다 보니 XML-RPC 플러그인을 깔면 버그질라와 동등한 환경을 구성할 수 있더군요.

Trac의 XML-RPC 플러그인은 이곳에서 다운 받을 수 있습니다. 소스를 제가 올려두겠습니다.

1178778508.zip


설치를 한번 해볼까요? 위의 소스를 적절한 위치에 올려두고 시작하겠습니다.
[code][root@Theeye src]# ls
xmlrpcplugin.zip
[root@Theeye src]# unzip xmlrpcplugin.zip
[root@Theeye src]# cd xmlrpcplugin/0.10/
[root@Theeye 0.10]# python setup.py bdist_egg
[root@Theeye 0.10]# cd dist/
[root@Theeye dist]# easy_install TracXMLRPC-0.1-py2.5.egg
Processing TracXMLRPC-0.1-py2.5.egg
Removing /usr/lib/python2.5/site-packages/TracXMLRPC-0.1-py2.5.egg
Copying TracXMLRPC-0.1-py2.5.egg to /usr/lib/python2.5/site-packages
TracXMLRPC 0.1 is already the active version in easy-install.pth


Installed /usr/lib/python2.5/site-packages/TracXMLRPC-0.1-py2.5.egg
Processing dependencies for TracXMLRPC==0.1
Finished processing dependencies for TracXMLRPC==0.1[/code]

설치는 끝났고 trac.ini에 컴포넌트 설정을 추가하겠습니다.
[code][components]
webadmin.* = enabled
tracrpc.* = enabled // 추가[/code]

다음과 같이 Eclipse환경에서 개발하는 개발자들 혹은 그룹에 XML_RPC 권한을 부여합니다.
[code]trac-admin /env/trac permission add developer XML_RPC[/code]

여기까지 왔으면 되어야 하지만 문제가 있습니다. 제가 올렸던 강좌를 따라하신 분들이라면 인증에 문제가 발생할 수 있습니다.

tracd로 standalone 모드로 실행하셨다면 문제가 될 수 있는데요. 예전 강좌에서는 digest(–auth)로 인증을 했었는데 passwd방식으로 바꾸어야 합니다.
[code][root@Theeye trac] htpasswd -nb eye eyepasswd >> passwd[/code]
위와 같이 필요한 사용자들의 계정과 비밀번호를 생성합니다.

이후 –basic-auth옵션으로 tracd를 실행합니다.
[code][root@Theeye trac]tracd -d -p 80 –basic-auth trac,/env/trac/passwd,trac /env/trac[/code]

기존의 주소에서 xmlrpc만 붙여 접속해 봅시다. (예 : http://localhost/trac/xmlrpc)
다음과 같이 XML-RPC API 페이지가 뜨면 플러그인이 정상적으로 작동하고 있는것입니다.
사용자 삽입 이미지

이제 Trac은 모두 준비가 끝난것 같습니다. 이번엔 Eclipse로 돌아가 보도록 할까요?

사용자 삽입 이미지Task Repositories 윈도우를 추가합니다. 오른쪽 버튼을 클릭하고 Add Task Repositories를 선택합니다.

사용자 삽입 이미지Trac을 선택합니다.

사용자 삽입 이미지자신의 트랙 접속 주소와 로그인 계정 정보를 입력하고 Validate Settings를 클릭합니다. 연결에 문제가 없으면 Finish 버튼이 활성화 됩니다.

사용자 삽입 이미지곧바로 Query를 작성하는 창이 뜹니다. Query Title에 대충 All이라고 적고 Finish를 선택하겠습니다. 아무것도 선택된것이 없으므로 조건이 없는것이고 조건이 없다는것은 전체를 가져오겠다는 의미를 갖습니다.

Query란?

Mylin에서는 하나의 작업을 Task라고 부릅니다. 실무를 하다보면 엄청나게 수많은 Task가 쌓이겠죠.
이 Task들에 특정 조건을 두어 내가 보고 싶은것만 그룹으로 묶어 받아볼 수 있습니다.
예를 들면 “나에게 할당 된 Task”, “현재 매우 심각한 문제”, “특정 컴포넌트에 관한 모든것” 과같이 필요한 조건을 두어 그룹으로 지정해 두고 받아볼 수 있습니다. 검색을 생각하시면 되겠군요.

곧바로 조건에 맞는 Task들의 알람이 쭉쭉 표시가 됩니다. Task List 윈도우를 추가해서 봅시다.
사용자 삽입 이미지도착한 Task의 목록이 나오는군요. 더블클릭을 하면 해당 Task의 상세 정보가 나옵니다. 문제를 해결했다면 코멘트를 달고 바로 Resolve할 수 있습니다.

해당 Task 그룹에 오른쪽 버튼을 클릭하고 New – Task를 하면 바로 Task를 추가하여 다른 개발자에게 해야할 일을 적어 티켓 발행을 할수도 있습니다.
사용자 삽입 이미지
Trac(with XML-RPC plugin) 과 Eclipse(with Mylin) 연동 글을 여기서 마치겠습니다.