태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.

인텐트(Intent) 입문- (1) 액티비티 호출

2009.03.07 11:50

이번 강좌에서는 인텐트(Intent)를 이용하여 다른 액티비티를 불러오는 것에 대해 알아보도록 하겠습니다.

일단, 강좌를 따라오기 전에, 준비해야 할 것들은 다음과 같습니다.

- 새로운 프로젝트
- 두 개의 소스 코드 및 레이아웃 코드 (액티비티를 두 개 만들어야하니, 당연히 두 개 필요하겠죠??)

중요!!
프로젝트에 액티비티를 추가하는 방법은 이전 포스트(2009/03/01 - [안드로이드/안드로이드 입문] - [강좌] [수정] 이클립스에서 안드로이드 액티비티 추가하기 ) 에서 상세하게 다루고 있으니, 이 글에서는 따로 다루지 않겠습니다.

이번 강좌에서 예제로 만드는 어플리케이션의 구성은 다음과 같습니다.

* 첫 번째 액티비티에서 버튼을 누르면 두 번째 액티비티가 호출됨
* 두 번째 액티비티에서 종료 버튼을 누르면 두 번째 액티비티가 종료됨

우선, 첫 번째 액티비티의 레이아웃 코드와 소스 코드를 보겠습니다.

[레이아웃]
<
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
	android:orientation="vertical" 
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" 
	android:layout_height="wrap_content" 
	android:text="첫 번째 액티비티 화면입니다."/>
<Button android:layout_width="fill_parent" 
	android:layout_height="wrap_content" 
	android:text="두 번째 액티비티 호출" 
	android:id="@+id/launchActivity"></Button>
</LinearLayout>


[소스]
package com.androidhuman;
import android.app.Activity;
import android.content.Intent; // 인텐트 사용 위해 import합니다.
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Activity1 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                Button launch = (Button)findViewById(R.id.launchActivity);
        launch.setOnClickListener(new Button.OnClickListener(){
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent = new Intent(Activity1.this, Activity2.class); // 두번째 액티비티를 실행하기 위한 인텐트
		startActivity(intent); // 두번째 액티비티를 실행합니다.
			} 
       	        });
    }
}


다른 것들은 대부분 앞에서 다루었던 것들이고, 생소한 것은 단연 인텐트(Intent)일 것입니다. 인텐트에 관한 것을 설명하자면 엄청 길어지지만, 항상 그래왔던 것처럼(!) 하나하나씩 다루어보도록 하겠습니다. (그래도 늦지 않는답니다!)

이번 예제에서 사용한 인텐트의 생성자는 "다른 액티비티를 호출할 때" 사용하는 생성자입니다. 참고로 인텐트를 사용하여 다른 네이티브 액티비티(전화번호 입력기, 주소록, 브라우저등..)도 호출할 수 있습니다. 하지만 일단 그런 것은 나중에 다루도록 하고, 이번 강좌에서는 사용자 액티비티를 호출하는 것에 대해 다루도록 하겠습니다.

그럼, 생성자의 원형을 분석해보도록 합시다.

public Intent(Context packageContext, Class<?>cls)

* packageContext : 
문서에는 어렵게 설명되어있지만, 한마디로 말하면 호출하는 액티비티를 뜻합니다. 여기에서는 Activity1 이 되겠습니다.
(Activity1.this)
*cls :
호출할 클래스를 뜻합니다. 여기에서는 Activity2 액티비티를 호출해야하므로, Activity2의 클래스인 Activity2.class를 입력합니다.


이렇게 인텐트 설정이 끝났으면, 인텐트를 실행해야겠지요? 사실, 인텐트 자체를 생성함으로써 인텐트가 실행되는 것이 아니라, 인텐트는 하나의 "실행하는 방법"만을 담고 있고, 실제로 그 일을 수행하는 것은 startActivity()메소드가 담당합니다. 인텐트를 실행하는 메소드도 이것 말고도 여러 가지가 있지만, 일단은 요거 하나만 다뤄보도록 하겠습니다.

public void startActivity(Intent intent)

파라미터로 받은 intent 인텐트를 실행합니다.


자, 그럼 첫 번째 액티비티에 대한 코딩은 끝났으니 두 번째 액티비티에 대한 소스와 레이아웃을 설계해보도록 하죠.

[레이아웃]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/LinearLayout01">

<TextView android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="두번째 액티비티 화면입니다. 아래 버튼을 누르시면 액티비가 종료됩니다." 
android:id="@+id/Activity_2_text"></TextView>

<Button android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="액티비티 종료하기" 
android:id="@+id/terminateActivity"></Button>
</LinearLayout>

[소스]
package com.androidhuman;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Activity2 extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.layout2);
	    Button terminate = (Button)findViewById(R.id.terminateActivity);
	    terminate.setOnClickListener(new Button.OnClickListener(){
		public void onClick(View v) {
		// TODO Auto-generated method stub
		finish(); // 액티비티를 종료합니다.
		}
	    		   
 		});		    

	}
}


두 번째 액티비티는 사실 더 별 거 없습니다. 버튼에 리스너 다는 건 이제 아무것도 아니고, 인텐트도 없구요. 대신에, 액티비티를 종료하는 메소드인 finish()메소드를 볼 수 있습니다. 사용자가 액티비티를 종료하고 싶을 땐, 이 finish()메소드를 사용하면 됩니다.

public void finish()

액티비티를 종료합니다.

여기까지 잘 따라오셨다면, 다음과 같은 화면을 보실 수 있을 것입니다.
첫 번째 액티비티에서 버튼을 누르면 두 번째 액티비티가 실행되고, 두 번째 액티비티의 버튼을 누르면 두 번째 액티비티는 종료됩니다.

이로서, 인텐트에 대한 첫번째 강좌를 마치도록 하겠습니다.
인텐트는 사실 이 강좌에서 다룬 것보다 훨씬 복잡한 기능을 가지고 있지만, 당장 어플리케이션을 만드는 데 우선순위가 높은 "사용자가 만든 액티비티를 호출"하는 방법에 대해 먼저 다루어보았습니다.

다음 시간에는 사용자가 만든 액티비티를 호출하지만, 조금 더 고급 기능을 사용하는 방법에 대해 다루도록 하겠습니다.

* 추가 - 3/7(토)
많은 분들이 잘 안된다고 하시는데... 아마도 위에 쓴 "액티비티 추가하기" 강좌를 보시지 않아서 그럴 것으로 생각합니다.

일단, 가장 중요한 것은 액티비티 추가 과정을 제데로 수행 하는 것입니다. 액티비티를 추가하는 과정에서 하나라도 빠지게 되면 당연히 오류가 생길 수 밖에 없습니다. 액티비티를 추가하는 방법은 2009/03/01 - [안드로이드/안드로이드 입문] - [강좌] [수정] 이클립스에서 안드로이드 액티비티 추가하기 를 참고하시고, 그래도 제데로 되지 않는 부분이 있다면 자세한 내용과 함께 질문 올려주세요~~


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

커니 어플리케이션 구성/인텐트(Intent) , , , , ,

  1. 이전 댓글 더보기
  2. 정말 감사드립니다...

    사실 암시적 인텐트는 잘 이해가 안 되서 대충 넘어갔는데...
    말씀 듣고 한번 해 보니까 훨씬 낫네요.

    일단 intent.setClassName(this, 변수); 이거 써서 원래 하려고 했던거랑은 거의 비슷하게 됐어요.

    그리고 암시적인텐트를 써서 배열 수를 팍 줄일 수 있었구요.
    그런데 아래 코드 보면 제가 짠 로직으로는 ListView에서 예를 들어 P로 검색하면 PICKER 하나가 뜨는데 이게 1번이 되서 누르면 HELLOWWORLD가 나오더라구요.
    물론 SAMPLE을 없애고 모두 암시적인텐트에서 같은 ACTION 걸어놓으면 해결 되겠지만 지금 배우는 입장이니 LISTVIEW의 이런 문제점도 한번 해결하려고 합니다.
    혹시 아시면 ^^ 알려 주시면 감사하겠습니다.

    public class implecitStart extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setListAdapter(new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1, SAMPLES));
    getListView().setTextFilterEnabled(true);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    String target = "my.accumulate." + SAMPLES[position];
    Intent intent = new Intent(target);
    Toast.makeText(implecitStart.this, target, Toast.LENGTH_SHORT).show();
    startActivity(intent); }

    static final String[] SAMPLES = new String[] {
    "HELLOWORLD", "LAYOUT","PICKER","FORM"
    };

  3. 보통은 position 정보를 이용하기보다는 id정보를 많이 이용합니다. (선택한 항목의 id값 - 데이터베이스 연동에서 쓰이죠)

    ListView에서 Filter를 사용하게 되면 위와 같은경우 p로 시작하는건 딱 하나밖에 없으니 선택한 인덱스 값이 0이 되는게 맞습니다. 그래서 HelloWorld가 뜨게 되는거구요.

    결론적을 말씀드리자면, 저 로직에서는 위의 문제를 해결할 뾰족한 방법이 없는 걸로 보이네요. 조금 더 깊이 생각을 해보든지, 다른 로직으로 바꿔보든지 해야 할 것 같습니다. ㅠㅠ

    (제가 어플을 작성할 때는 저런 경우가 없어서요.;;)

  4. Blog Icon
    웅컁컁

    커니님 안녕하세요~
    강좌 잘 따라해보고 있습니다
    다름이 아니고 제가 탭 두개 만들어서 인텐트 써가지고 불러오는거 해보고 있는데요
    java.lang.noclassdeffound 나오면서 불러오려고 하는 액티비티 있는 클래스를 못찾겠다고 나오네요
    분명히 오타도 아니고 멀쩡하게 패키지 안에 잘 있는데 왜그러는 걸까요?

  5. 메니페스트 파일에 액티비티 선언이 되어있는지 확인해보세요.

  6. Blog Icon
    초보

    강좌 잘보고 있습니다. 저같은 초보에게 도움이 많이 되네요
    질문이 있는데요...다른 액티비티로 넘어가는거에 버튼을 사용하셨는데
    버튼형식말고 그냥 텍스트형식에 에 링크 걸어서 눌렀을때 다른 액티비티로 가게 할 수 있나요?
    가령 jsp에서 볼때 <a href=> 텍스트</a> 이런식으로 링크 걸어서 눌렀을때 다른 페이지로 가는것처럼
    그냥 텍스트뷰형식같은거로 만든 것도 링크 걸어서 다른 액티비티로 가게 되는지 궁금하네요

  7. 여러 텍스트 중 특정 텍스트에만 링크를 거는건 잘 모르겠고...
    텍스트뷰 자체를 클릭했을때 다른액티비티로 넘어가도록 할 수는 있습니다.

    onTouchEvent를 사용하시면 될 것 같군요.

  8. Blog Icon
    양박사

    BaseAdapter로 상속을 받아서 , 새로운 어댑터를 생성했구요 , 그 안에 버튼들이 리스트 업 됩니다.
    사용자가 선택을하면 , 선택한 정보를 받아서 새 인텐트를 실행하려고 하는데

    메인클래스가 아니라 따로 만들어져있는 어뎁터 클래스라서 그런지 ,
    Intent i = new Intent(maincon, custBill.class);
    maincon.startActivity(i);
    하면 에러네요 maincon은 생성시 가져온 콘텍스트입니다.

    뭔가 방법이 있을듯 한데... 좀 부탁드릴께요

  9. Blog Icon
    Ellie

    잘 보고 갑니다. 덕분에 많은 도움이 되었어요^^

  10. Blog Icon
    진인

    지금도 답변해주실수 있나 몰르겠네용~~
    저도 보고 해봣는데요~
    에러 없구요~ 엑티비티 연결 됀것같은데요
    에뮬레이터로 실행을 해서 클릭을 하면 넘어가긴 가는대요....
    서브 엑티비티 화면이 안나오고 검은 화면으로 바뀌네요;;;;
    에러는 없는것 같구요... 왜이런건지... 2틀제 고민중이군요;;; 다시해도 이모냥이고.. 혹시 아시나용 ㅜ.,ㅜ

  11. 피호출 액티비티에서 레이아웃을 설정하셨나요?

    레이아웃을 생성하고 setContentView() 등의 메서드로 레이아웃을 지정하지 않으셨을 가능성이 높아보이네요!

  12. Blog Icon
    초보

    안녕하세요
    보고 따라해 보았는데요
    두 번째 액티비티 호출 을 눌러도 안넘어가서요~
    두번째 레이아웃을 어디에 추가해야될지 몰라서 layout 폴더에 layout2.xml로 만들어서 넣었는데 다른곳에 넣어야 하는건지요

  13. 안넘어간다는건 srartActivity()를 호출하지 않거나, 버튼의 OnClickListener가 제대로 등록되어 있지 않아서 그렇습니다.

    코드를 다시한번 확인해보세요~

  14. Blog Icon
    초보

    글 내용보고 한거라 빠진건없는거 같은데ㅠㅠ;
    어렵네요

  15. 안넘어간다는게 버튼을 눌러도 반응이 없다는건가요, 아니면 에러가 뜨는건가요?

    어려운 내용은 아닌데 처음 하시면 헷갈리실 수도 있어요. 아무튼 이전 댓글에 단 항목을 꼼꼼하게 다시한번 확인해보세요.

  16. Blog Icon
    淸月

    정말로 감사합니다 ㅠ,.ㅠ
    이 것 때문에 며칠동안 고민하고 자료를 찾았는데, 덕분에 해결되었습니다.
    복받으실껍니다 ㅠ,.ㅠb

  17. Blog Icon
    Hayanse

    음 종료 버튼 찾다가 이 글을 보게 됬는데요.. 피니쉬를 쓰면 두번째 장에서 첫번째 장으로 넘어가잖아요.
    그럼.. 두번째장에서 첫번째가 아닌 어플을 종료하는 방법은 어떻게 되는지요;; 이걸 찾을수가 없네요.

  18. 애플리케이션과 액티비티의 개념과 액티비티 스택 부분을 다시 한번 보시기를 추천합니다. 아마 애플리케이션이 아니라 액티비티를 말씀하시는 것 같은데, 안드로이드에서는 액티비티 스택을 잘 관리하는 방법으로 모든 것을 컨트롤해야 합니다. 액티비티 속성을 어떻게 지정하느냐에 따라 액티비티 스택에 남도록 할 수도 있고, 액티비티 스택을 모두 날릴 수도 있고, 액티비티 스택의 순서를 바꿀 수도 있습니다.

  19. 아, 그리고 안드로이드 앱에서 종료를 한다는 것은 어디에서든지 '종료' 버튼을 눌러 종료를 하기보다는 액티비티 스택을 clear한다는 개념으로 보시는게 더 정확합니다.

    일련의 액티비티 스택이 있고, 적합한 경로를 따라 애플리케이션을 실행하다가 사용자가 역순으로 자연스럽게 애플리케이션에서 빠져나오도록 액티비티 flow를 설계하는 것이 가장 중요하다 할 수 있습니다.

  20. Blog Icon
    아귀

    안드로이드 공부 하다가 좋은글 보게 되서 우선 감사합니다.

    질문이 있는데요 메인 엑티비티에서 엑티비티를 호출하고 그 호출한 엑티비티에서 또다시 엑티비티를

    호출할수는 없나요?? 위에 글대로 해보려고 했는데 오류는 없는데

    Caused by: java.lang.SecurityException: Neither user 10038 nor current process has android.permission.WAKE_LOCK. 이렇게 뜨네요 ㅠㅜ 답변 좀 부탁드립니다. ~

  21. 액티비티 호출과는 관련없는 오류입니다. 아마 다른 곳에서 오류가 난 것으로 추정됩니다. 아니면 Wake lock을 잘못 사용하셨을지도 모르겠군요.

  22. 좋은 글 잘 보고 갑니다. 다음에도 또 좋은 글 기대 할께요. 퍼가도 되죠?

  23. 오랫만입니다~ 커니님~ ^_^

    다른게 아니라, onCreate에서 Bundle savedInstanceState 가 안 불러지는 상황이 발생하는데

    무엇이 문제인걸까요~

    새 엑티비티를 생성했는데, oncreate 함수가 아무런 변수를 못 불러오는 것 같습니다.

    setContentView도 설정하는데 실패가 뜨네요~

  24. 해결했습니다^^;;;

    그래도 안부차 댓글은 그대로 유지~ ^^

  25. Blog Icon
    하준

    궁금한게 있어서요.

    지금 졸업작품으로 안드로이드 앱 어린이 동화를 만들고 있습니다.

    만들다 보니 액티비티들을 여러개가 필요하더라구요

    그래서 위의 글을 읽고 실행을 해보니 1페이지에서 2페이지로는 넘어갑니다

    그런데 2페이지에서 3페이지로 안 넘어가더라구요

    Logcat 내용을 살펴보니 thread exiting with uncaught exception(group=0x409c01f8)이라구 적어져 있더라구요

    졸작을 만들려구 이번에 처음으로 안드로이드에 손을 대게 됐는데

    그동안 커니님 웹페이지 보고 지금까지 수월하게 만들어왔다 생각했는데

    여기서 막히니 어떻게 해야할지를 모르겠더라구요

    답변 좀 부탁드리겠습니다.

  26. 로그캣에 다른 내용을 보셔야 할 듯 하네요.
    보통 caused by : 부분에 오류 원인이 나와있습니다.

  27. Blog Icon
    솔향

    잘되네요 ㅎㅎ 감사합니다 ^^ 처음 액티비티를 제대로안해서 한시간가량 날렸지만 다른 문제점은 없는듯해요 ㅎㅎ.
    좋은자료 감사합니다 ^^ 혹시 블로그에 퍼가도될까요? ㅎ

  28. 출처와 링크 본문에 남겨주시면 됩니다 :)

  29. Blog Icon
    곽가

    안녕하세요~ 혹시 아직도 커멘트에 답을 해주시련지..

    첫번째 레이어에서 2개의 버튼을두고
    각각의 레이어로 가는 액티비티와 다시 메인으로 돌아가는 버튼을 구성했는데
    메인으로 돌아올때 예상치 않게 중지되었다고 뜨는걸까요

  30. http://androidhuman.com/242 를 참조하세요. 자세한 로그가 없으면 분석할 수가 없습니다~

  31. Blog Icon
    날개

    다따라했는데 잘안돼네요
    첫번째는 나왔는데 넘어가면서 "오류로 중지되었습니다"라는 메세지가 뜨며 중단되네요 벌써 열두시간째 붙들고 있는데 안되네요
    처음에 제가 두번째 엑티비티의 자바안에 소스를 추가하지 않았을때는 그냥 하얀화면만뜨더니 제대로 따라해서 소스를 넣으니 이제 오류로 뜨지않네요 도와주세요

  32. http://androidhuman.com/242 를 참조하세요. 자세한 로그가 없으면 분석할 수가 없습니다~

  33. Blog Icon
    날개

    자세한 로그가 없으면 분석할수 없다 하셔서 주신 페이지로 넘어가 따라해보았습니다 그런데 Caused by 이부분을 찾았는데 이곳이 중요하시다고 해서 보았는데 nullPointerException이라고 만 떠서 모르겠습니다 도와주세요..

  34. NullPointerException 이면 객체가 제대로 할당되지 않아 발생하는 문제입니다. 자세한 내용을 적어주시지 않아 어떤 상황인지 추측이 어렵지만,

    - 액티비티간 값을 넘기고 받는 과정에서 키 값을 잘못 적어 전달이 잘 되지 않은 경우
    - 레이아웃 내에 뷰를 잘못 참조하는 경우

    이 두 가지 중에 원인이 있지 않을까 생각됩니다.

  35. Blog Icon
    우산소울

    잘봤습니다. Activity 실행에 대해 간단하게 이해할 수 있어서 좋았습니다.

  36. Blog Icon
    꿈을가져용

    너무 잘 봤습니다!

    감사합니다!

  37. Blog Icon
    타디스

    안녕하세요.
    저는 안드로이드 스튜디오로 앱을제작하고 있는
    개발초보자입니다.

    위 내용은 버튼을 통한 Activity호출인데,
    저는 네비게이션드로우 toggle list에서 Activity호출이라
    앱에서 오류가 납니다.

    switch (id) {
    case R.id.ic_home:
    startActivity(new Intent(this, MainActivity.class));
    break;
    case R.id.ic_message:
    startActivity(new Intent(this, MessageActivity.class));
    break;
    case R.id.ic_info:
    startActivity(new Intent(this, InfoActivity.class));
    break;
    }

    앱에서 해당하는 메뉴를 누르면 이동이 되기전에 꺼져서요 ㅠㅠ

  38. 호출하는 액티비티 (MainActivity, MessageActivity, InfoActivity) 가 매니페스트에 등록 되어있나요? 그 부분을 먼저 확인해 보시면 좋을 것 같습니다.

  39. Blog Icon
    타디스

    <activity
    android:name=".MessageActivity"
    android:label="@string/app_name">
    <intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    </activity>

    이런식으로 message와 info 액티비티 매니페스트에 등록되어있는 상태입니다 ㅠㅠ