본문 바로가기

Android Tutorial/Activity

[Android Tutorial Extra #01] Activity(액티비티)가 뭔가요? - 2


안드로이드 튜토리얼 목차 - Android Tutorial List

[Android Tutorial Extra #01] Activity(액티비티)가 뭔가요? - 2

이번 포스트는 지난 포스트에 이어, 액티비티가 뭔가요? 2번째 글입니다.

 지난 포스트
 [Android Tutorial Extra #01] Activity(액티비티)가 뭔가요? - 1 

 원본
 안드로이드 개발자 가이드 - Activities(액티비티) 



 Starting an Activity - 액티비티 실행(시작)하기

당신은 startActivity()를 호출함으로써 또다른 액티비티를 실행할 수 있습니다. 
이때, Intent에 당신이 실행(시작)하려는 액티비티를 서술해서 파라미터로 전달합니다.
인텐트는 당신이 실행하려는 정확한 액티비티를 지정하거나, 당신이 서술해 놓은(describe) 실행(수행-perform)하기를 원하는 액션의 타입을 지정합니다.
(인텐트는 명확한 액티비티를 지정하거나, 서술해 놓은 액션의 타입을 지정합니다. 사실 인텐트는 조금은 뭉뚱그려서 액션들을 지정해도 알아서 실행해주는 아주 고마운 녀석이죠.)
또 인텐트는 액티비티가 시작될때 사용될수도 있는 작은양의 데이터를 가지고 다닐 수 있습니다.
(이전 액티비티에서 인텐트에 데이터를 넘기고, 다음 액티비티에서 그 데이터를 꺼내서 사용할 수 있습니다.)

당신 자신의 애플리케이션에서, 당신은 종종 알려진 액티비티를 간단하게 런치 launch 하는게 필요할 수 있습니다.
당신은 클래스의 이름을 사용해서, 당신이 시작하려는 액티비티가 명확하게 정의된 인텐트를 만듦으로서 액티비티를 간단하게 런치할 수 있습니다. 

SignInActivity라는 이름을 가진 또다른 액티비티를 실행하는 한가지 예를 들어보겠습니다.

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

또한 아마도 당신의 애플리케이션은 액티비티에서 이메일, 텍스트 메시지를 보낸다던지, 상태를 업데이트하는 것 같은 몇가지 액션을 수행하기를 원할 것입니다.
이런 경우에, 당신의 애플리케이션에 있는 액티비티들에 이런 각각의 기능들을 가지고 있지는 않을 겁니다. 그래서 당신의 애플리케이션은 디바이스에 있는 다른 애플리케이션으로 당신의 액션을 수행할 수 있는 액티비티들을 제공할 수 있습니다. 
인텐트는 정말 중요합니다.
당신은 액션을 서술한 인텐트를 만들 수 있고, 시스템(안드로이드)은 다른 애플리케이션으로부터 적절한 액티비티를 launch하게 됩니다. 
만약, 이렇게 만들어진 인텐트를 처리할 수 있는 여러개의 액티비티들이 있다면, 유저는 그것들 중 사용할 하나를 선택할 수 있습니다.

예를 들면, 유저가 메일을 보내기를 원한다면, 당신은 아래처럼 인텐트를 만들 수 있습니다.

Intent intent = new Intent(Intent.ACTION_SEND);
intent
.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity
(intent);

인텐트에 추가(put/add)되어있는
EXTRA_EMAIL 엑스트라는 이메일이 보내지는 이메일 주소의 스트링 어레이 String array입니다.
(이메일을 받을 주소를 스트링 어레이 형태로 인텐트를 통해 전달 할 수 있습니다.)
이 인텐트에 의해서 이메일 애플리케이션이 응답했을 때, 이메일 애플리케이션은 엑스트라에서 제공된 스트링 어레이를 읽어들여서, 이메일 구성 폼의 "to" field에 위치시킵니다.
이런 상황에서, 이메일 애플리케이션의 액티비티는 실행되고, 유저가 할일을 마치면, 당신의 액티비티는 resume상태로 돌아가게 됩니다.



 Starting an activity for a result - 결과를 받기 위한 액티비티 실행하기

때때로, 당신이 실행한 액티비티로부터 결과를 받고 싶을수도 있습니다.
이런 경우, startActivityForResult()를 호출함으로써 액티비티를 실행(시작)합니다.
(평소 사용하던 startActivity() 대신에 사용합니다.)
다음의 액티비티로 부터 결과를 받기 위해서 onActivityResult() 콜백 메소드를 구현해야 합니다.
이후 액티비티가 완료(종료)되면, 결과를 반환하는데, 이 결과는 Intent에 담겨져 당신의 onActivityResult() 메소드로 전달됩니다.

예를 들면, 당신은 유저가 주소록 중 하나의 연락처를 선택해서, 당신의 액티비티는 그 연락처안의 정보로 무언가를 하려고 한다면 아래의 예로 할 수 있을 겁니다.
아래는 결과를 받아올 수 있는 인텐트를 만들고 결과를 처리하는 방법에 대한 예입니다. 


private void pickContact() {
   
// Create an intent to "pick" a contact, as defined by the content provider URI
   
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
    startActivityForResult
(intent, PICK_CONTACT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   
// If the request went well (OK) and the request was PICK_CONTACT_REQUEST
   
if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
       
// Perform a query to the contact's content provider for the contact's name
       
Cursor cursor = getContentResolver().query(data.getData(),
       
new String[] {Contacts.DISPLAY_NAME}, null, null, null);
       
if (cursor.moveToFirst()) { // True if the cursor is not empty
           
int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
           
String name = cursor.getString(columnIndex);
           
// Do something with the selected contact's name...
       
}
   
}
}

이 예제는 액티비티 결과(다음 액티비티에서 넘겨준 결과)를 처리하기 위해서  onActivityResult() 메소드를 사용하는 간단한 로직 logic을 보여줍니다. 

첫번째 조건(resultCode)은 요청이 성공적인지 아닌지를 체크합니다.
만약 성공적이었다면 resultCode에 RESULT_OK가 오겠죠. 리퀘스트에 대한 이 결과가 알려진 것이라면, 두번째 파라미터로 넘어갑니다. 
(알려진 것 : RESULT_OK, RESULT_CANCELED, RESULT_FIRST_USER)
요청이 성공한 경우, startActivityForResult()에 보냈던 
두번째 파라미터를 requestCode와 매치시킵니다. 여기서, requestCodedata라는 파라미터로 인텐트안에 결과가 반환되었는지의 질의를 통해 액티비티의 결과를 처리합니다.

어쨋든 간에, 
질의를 통해 읽을 수 있는 데이터인 Cursor가 반환되면, ContentResolver는 content provider에 질의를 수행합니다. 더 자세한 내용은 Content Providers 도큐먼트를 참고하세요. 

인텐트의 사용에 대한 더 많은 정보는 Intents and Intent Filters 도큐먼트를 참고하세요.



 Shutting Down an Activity - 액티비티 종료하기

당신은 finish() 메소드를 호출함으로써 액티비티를 셧 다운 shut down 할 수 있습니다.
또한 이전에 finishActivity() 메소드를 호출함으로써 시작했던 액티비티를 셧 다운 할 수 있습니다.

 Note: In most cases, you should not explicitly finish an activity using these methods.
          As discussed in the following section about the activity lifecycle,
          the Android system manages the life of an activity for you,
          so you do not need to finish your own activities.
          Calling these methods could adversely affect the expected user experience and
          should only be used when you absolutely do not want the user to return to this instance of the activity.



여기까지가 개발가이드 액티비티 부분에서 액티비티 생명주기(생애주기, lifecycle)이 나오기 이전의 내용입니다.
액티비티 생명주기 관련해서는 뒤에서 자세히 다뤄보도록 하겠습니다.


 
결론이 이미 글들에 나와있지만, 다시 한번 정리해 볼게요.

1. 액티비티는 화면을 보여주는 컴포넌트이다.

2. 액티비티는 윈도우를 가지고 있다.

3. 액티비티에서 어떤 뷰를 화면에 보여줄지 정할 수 있다.
    이때 우리는 보통 ~~.xml 이라는 xml로 만들어 놓은 레이아웃을 사용한다.
    이처리는 onCreate()에서 한다.

4. 다른 액티비티로 이동하려면 startActivity()를 사용하면 된다.
    이때 액티비티들은 백스택이라는 곳에 보관된다.

5. 액티비티간에 데이터를 주고받기 위해서는 startActivityForResult()를 사용한다.
    결과는 resultCode, requestCode, data를 체크해서 확인할 수 있다.

6. 내가 만든 애플리케이션에서 이메일 보내기, 전화하기등을 모두 지원할 수 없으므로, 
    인텐트에 적당한 액션을 적어서 실행하면 시스템(안드로이드)이 알아서 실행시켜준다.

7. finish(), finishActivity()로 액티비티를 셧 다운 할 수 있다.

중요한건 요정도. 끝! 다음에 또만나요~