안드로이드 액티비티 실행하기. (Starting Android Activity)

2016. 8. 17. 10:54


1. Activity.

[안드로이드 액티비티]에서 Activity에 대한 개념 및 기본적인 내용들에 대해 살펴보았습니다. Activity가 무엇인지 어느 정도 파악할 수 있었으리라 생각합니다.


물론, Activity에 대한 모든 내용이 설명된 것은 아닙니다. Activity 생명주기, Activity 상태 저장 및 관리, 기기 상태(화면 모드, 언어 설정 등) 변경에 따른 이벤트 처리 등, 알아야 할 내용이 많이 남아있습니다.


하지만 처음부터 복잡하고 어려운 내용부터 다루게 되면, Activity 사용법에 대한 이해가 더 어려워질 수 있습니다. 그러므로 가장 기초적인 내용에 대한 예제부터 살펴보도록 하겠습니다.


Activity에 대한 가장 기초적인 내용은, 역시, Activity를 만들고 실행하는 방법이겠죠. 지금부터 Activity를 만들고 실행하는 방법에 대해 살펴보겠습니다.


본문에는 글의 핵심 내용에 비해 다소 장황한 내용이 포함되어 있습니다. Activity를 추가하는 과정을 한번이라도 접해보셨다면, "3. 요약 및 쉬운 방법." 또는 이 글 이후의 Activity 관련 글을 참고하시기 바랍니다.

2. Activity 실행하기.

[안드로이드 액티비티]에서 설명했듯이, Activity를 실행하는 방법은 startActivity() 함수를 호출하는 것입니다. 하지만 그 전에 새로 실행할 Activity를 만드는 것이 우선이겠죠.

2.1 Activity 추가하기.

새로운 Activity를 실행하기 위해 필요한 파일은 두 개 입니다. 하나는 새로운 Activity 클래스 파일(예. "NewActivity.java")이고, 다른 하나는 새로운 Activity에 표시될 UI Layout이 정의된 Layout 리소스 XML 파일(예. "/res/layout/activity_new.xml") 입니다.


먼저 새로운 Activity를 추가하기 위해, "MainActivity"가 들어있는 패키지에서 마우스 오른쪽 버튼을 클릭한 다음, "New"-"Java Class" 메뉴를 선택합니다.

[STEP-1.1] "New" - "Java Class" 메뉴 선택.

안드로이드 스튜디오 클래스 추가


"Create New Class" 다이얼로그가 실행되면 클래스 이름을 입력하고 "OK" 버튼을 선택합니다.

[STEP-1.2] "Create New Class" 다이얼로그에 클래스 이름 입력.

안드로이드 스튜디오 클래스 이름 지정


새로 추가된 "NewActivity" 클래스가 "MainActivity"와 나란히 표시되는 것을 확인합니다.

안드로이드 스튜디오 클래스 추가


새로 추가된 "NewActivity" 클래스의 부모 클래스를 "extends" 키워드를 사용하여 지정합니다. 다양한 Activity 종류를 부모 클래스로 사용할 수 있지만, 예제에서는 MainActivity의 부모인 "AppCompatActivity" 클래스를 지정하겠습니다.

[STEP-1.3] "NewActivity.java" - 새로 추가된 Activity의 부모 클래스 지정.
public class NewActivity extends AppCompatActivity {

}

이제 Activity를 위한 Layout 리소스 XML 파일을 추가하겠습니다. 클래스 파일을 추가할 때와 비슷하게, "/res/layout"에서 마우스 오른쪽 버튼을 클릭한 다음, "New" - "Layout resource file" 메뉴를 선택합니다.

[STEP-1.4] "New" - "Layout resource file" 메뉴 선택.

안드로이드 스튜디오 layout 파일 추가


"New Resource File" 다이얼로그가 나타나면 XML 파일 이름을 입력하고 "OK" 버튼을 선택합니다.

[STEP-1.5] "New Resource File" 다이얼로그에 클래스 이름 입력.

안드로이드 스튜디오 layout 파일 이름


새로 추가한 "activity_new.xml" 파일이 "/res/layout/" 아래에 추가되어 있는 것을 확인합니다.

안드로이드 스튜디오 layout 파일 추가


2.2 추가된 Activity의 Layout 구성.

이제 Activity를 새로 추가하였으므로, 추가된 Activity의 Layout을 구성해야 합니다. 기능에 따라 다양한 View 위젯들이 사용되지만, 여기서는 간단하게 TextView 위젯 하나만 배치하도록 하겠습니다.

[STEP-2] "activity_new.xml" - 새로 추가된 Activity의 Layout 리소스 XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="30sp"
        android:text="New Activity" />

</LinearLayout>

2.3 추가된 Activity에 Layout 리소스 XML 표시.

새로운 Activity(NewActivity)를 추가하고 그에 대한 Layout 리소스 XML(activity_new.xml)도 추가하였으니, activity_new.xml에 정의한 UI를 NewActivity에 표시하는 코드를 작성해야 합니다. 이는 setContentView()함수를 호출함으로써 이루어집니다.


NewActivity에 onCreate() 함수를 추가한 다음, 아래와 같이 코드를 작성합니다.

[STEP-3.1] "NewActivity.java" - onCreate() 함수에서 setContentView() 함수 호출.
public class NewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);
    }

}

다음은 Layout 리소스 XML 파일(activity_new.xml)과 "setContentView(R.id.activity_new)" 함수 그리고 표시되는 UI의 상관 관계를 나타내는 관계도입니다.

안드로이드 setContentView


2.4 Activity 실행을 위한 Button 추가.

Activity를 실행하기 위한 코드를 작성하기에 앞서, 코드가 실행될 이벤트를 위해 MainActivity에 Button을 하나 추가하고 클릭 이벤트 핸들러를 작성합니다.

[STEP-4.1] "content_main.xml" - MainActivity의 Layout 리소스 XML에 Button 추가.
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:id="@+id/button1"
        android:text="Start New Activity" />

다음, 추가된 Button에 대한 클릭 이벤트 처리 코드를 추가합니다.

[STEP-4.2] "MainActivity.java" - 추가된 Button에 대한 클릭 이벤트 처리.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 코드 계속 ...

        Button button1 = (Button) findViewById(R.id.button1) ;
        button1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO : start New Activity
            }
        });
    }
}

2.5 추가된 Activity 실행.

이제 Button의 클릭 이벤트 핸들러에서 새로운 Activity(NewActivity)를 실행하는 코드를 작성합니다. [안드로이드 액티비티]에서 살펴본대로 명시적(explicitly) 실행 방법을 사용합니다.

[STEP-5] "MainActivity.java" - Button 클릭 시, 추가된 Activity(NewActivity) 실행.
        button1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, NewActivity.class) ;

                startActivity(intent) ;
            }
        });

2.6 실행 후 에러 확인.

코드 작성을 완료하였으면 앱을 실행한 다음, "Start New Activity" 버튼을 클릭하여 새로운 Activity(NewActivity)가 실행되는 것을 확인해보겠습니다.

안드로이드 startActivity


하지만 아래와 같은 에러 메시지가 출력되는 것을 확인할 수 있을 것입니다.

08-12 18:45:40.140 10470-10470/com.recipes4dev.examples.activityexample1 E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.recipes4dev.examples.activityexample1, PID: 10470
 android.content.ActivityNotFoundException: Unable to find explicit activity class {com.recipes4dev.examples.activityexample1/com.recipes4dev.examples.activityexample1.NewActivity}; have you declared this activity in your AndroidManifest.xml?

에러 메시지가 다소 긴 내용을 포함하고 있지만, 핵심 문장은 바로 이것입니다.

have you declared this activity in your AndroidManifest.xml?

2.7 AndroidManifest.xml 파일에 Activity 선언.

구글에서 제공하는 안드로이드 개발 API 가이드에 나와 있듯이, 새로운 Activity를 추가하여 사용할 수 있게 만드려면, 추가한 Activity 정보를 "AndroidManifest.xml" 파일에 선언해야 합니다. 즉, 위에서 발생한 에러 메시지는 AndroidManifest.xml 파일에 NewActivity에 대한 정보를 선언하지 않았기 때문에, "NewActivity"라는 Activity를 찾을 수 없다는 내용이죠.


AndroidManifest.xml 파일에 Activity에 대한 정보를 선언할 때는 "<manifest>" - "<application>"에 "<activity>"를 사용하며, "android:name" 속성에 Activity 클래스 이름을 지정합니다.

<manifest ... >
    <application ... >
            ...
        <activity android:name=".XXXActivity" />
            ...
    </application ... >
    ...
</manifest >

아래는 NewActivity를 선언한 AndroidManifest.xml 파일 내용입니다.

[STEP-6] "AndroidManifest.xml" - 추가한 Activity(NewActivity) 정보를 AndroidManifest.xml 파일에 기록.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.recipes4dev.examples.activityexample1">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NewActivity" />
    </application>

</manifest>

2.8 실행 확인.

추가한 Activity(NewActivity) 정보를 "AndroidManifest.xml" 파일에 선언하는 것까지 완료했다면, NewActivity가 정상적으로 실행되는 것을 확인할 수 있습니다.

안드로이드 startActivity


또한 NewActivity가 실행된 다음, "Back" 버튼을 누르면 MainActivity로 전환되는 것을 확인할 수 있습니다.

3. 요약 및 쉬운 방법.

3.1 Activity를 추가하는 과정 요약

위에서 Activity를 실행하는 과정이 다소 장황한 내용으로 설명되었지만, Activity를 추가하는 과정은 아래 그림과 같이 단순하게 요약될 수 있습니다.

안드로이드 액티비티 추가


3.2 Activity 추가를 위한 쉬운 방법

Activity를 추가하는 과정이 복잡하다고 할 순 없지만, 훨씬 간편하게 할 수 있는 방법이 있습니다. 바로 안드로이드 스튜디오에서 제공하는 "Activity 추가 기능"을 사용하는 것이죠.
이 기능을 사용하면 요약에서 설명한 Activity 클래스 추가, Layout 리소스 XML 추가, Activity에 Layout 표시, AndroidManifest.xml에 Activity 선언 등의 모든 과정이 한번에 해결됩니다.


새로운 Activity를 추가하기 위해서는 "MainActivity"가 들어있는 패키지에서 마우스 오른쪽 버튼을 클릭한 다음, "New" - "Activity" - "Empty Activity" 메뉴를 선택합니다.

예제에서는 "Empty Activity"를 사용하였지만, 대부분의 경우에, 구현하고자 하는 기능에 적합한 Activity를 선택하게 될 것입니다. 각 Activity는 프로젝트 생성 시 Activity 템플릿 선택 과정에서 볼 수 있는 내용과 일치합니다.

안드로이드 스튜디오 액티비티 추가 메뉴


Activity와 관련된 파일 이름을 지정하는 다이얼로그가 실행됩니다. Activity 클래스 이름을 입력하면, 그에 따라 Layout 리소스 XML 파일 이름이 자동으로 완성되므로 "Finish" 버튼을 눌러 생성을 완료합니다. (만약 Layout 리소스 XML 파일 이름을 직접 지정하고 싶다면, "Layout Name"에 직접 이름을 입력하면 됩니다.

안드로이드 스튜디오 basicActivity


위에서 설명한 모든 파일들이 자동으로 생성되는 것을 확인할 수 있습니다.

안드로이드 스튜디오 액티비티 관련 파일


4. 참고

.END.


ANDROID 프로그래밍/ACTIVITY , , , , , , , ,

  1. Blog Icon
    감사하비다

    정리가 잘되어있어서 초심자가 배우기에 매우좋네요

  2. 쉽게 설명하려다 보니, 내용이 넘 장황해진 것은 아닌가... 하는 생각도 드네요.
    도움이 되셨으면 좋겠습니다.

    감사합니다.

  3. Blog Icon
    최고!

    이렇게 시각적으로 알려주시니.. 왠만한 책보다 정리가 잘 되어 있네요!
    정말 감사합니다 :)

  4. 일단 그림이 있으면 이해가 더 쉬울거라 생각해서 그림과 같이 작성하였습니다.
    하지만 시중에 나온 책의 내용을 따라가려면 한참 멀었네요.
    더 좋은 내용, 쉬운 설명 올릴 수 있도록 노력하겠습니다.

    감사합니다.

  5. Blog Icon
    구글러

    너무 잘봐서... 댓글 달고 갑니다. 정리 감사합니다.

  6. 잘 보셨다니 정말 다행입니다.
    댓글 남겨주셔서 감사드립니다.

  7. Blog Icon
    urbest

    마우스 오른쪽버튼그림까지 ㅋㅋ
    이보다 자세하게 설명할 순 없을 듯 합니다.
    SO GOOOOOOOOOOOOOD!

  8. 자세하게 쓰려고 노력했지만,
    좋은 글인지는 잘 모르겠어요. ㅜㅜ
    그래도 이런 격려글은 정말 힘이 나네요.
    방문해 주시고, 칭찬글까지 남겨 주셔서 감사합니다.

  9. Blog Icon
    kate

    친절한 설명 너무 좋네요! 장황하지 않고 읽기 좋은거 같아요 감사합니다!!^__^

  10. 칭찬글 남겨주셔서 힘이되네요!!
    저도 감사합니다. ^^

  11. Blog Icon
    성현구

    안드로이드 어플 공부하고 있는데 많은 도움이 됩니다. 감사합니다!!

  12. 아직 내용이 많지 않아서, 부족함을 많이 느낍니다.
    더 많은 도움 드릴 수 있도록 노력하겠습니다.
    감사합니다.

  13. Blog Icon
    논리설계기초

    많은 도움이 됩니다!
    잘 정리해주셔서 정말 감사합니다!

  14. 도움이 되셨다니 다행입니다.

    방문해 주셔서 감사합니다!

  15. Blog Icon
    너구리

    안드로이드 처음 시작하는 사람인데 도움이 많이 되었습니다. 내용을 쉽게 설명하는것도 능력이 있어야 할 수 있는 일인데 저같은 사람도 이해할 수 있게 해주셨네요. 정말 감사합니다!

  16. 도움이 되셨다니 다행입니다.
    허접한 글 올려놓고, 더 좋은 내용 담지 못해 자책도 많이 했는데...
    이렇게 격려를 해주시니 힘이 나네요.
    좀 더 좋은 내용 담을 수 있도록 노력하겠습니다.

    감사합니다.

  17. Blog Icon
    안드로이드 독학

    자바 공부하고 안드로이드 독학중입니다 ㅠㅠ 취업준비생인데
    인강이나 책은 너무 어렵고 이해가 안됬는데 좋은 블로그 입니다
    이해하기 쉽게 풀어주셨네요 감사합니다~

  18. 취업 준비는 잘 되어 가시나요?
    음... 지금은 이미 마음에 드는 "좋은 직장!"에 취업하신, "직장인"이시면 좋겠네요.

    프로그래밍을 독학하는 게 쉽지는 않겠지만, 계속 공부하고 개발하다보면 어느 새 전문가가 되어 있을 것입니다.

    열심히 하시고, 삶에 행복이 가득하길 바랍니다.

    감사합니다.

  19. 잘 읽고 갑니다 글에 정성이 느껴지네요

  20. 정작 알맹이는 부실하고, 정성만 가능한 글이지요. ㅜㅜ
    답글 남겨주셔서 감사합니다.

  21. Blog Icon
    아흐 진짜

    이 완벽한 강의를 어쩔꼬

  22. 가끔 생각나실 때 또 들러주세요. ^^
    최대한 많은 내용 담을 수 있도록 노력하겠습니다.

    감사합니다.

  23. Blog Icon
    한땡땡

    초심자에게 너무 많은 도움이 되네요. 좋은 강의 감사합니다.

  24. 최대한 쉽게 설명하려고 노력했으나, 아직 부족함을 많이 느낍니다.
    그래도 도움이 되셨다니, 뿌듯하네요.

    감사합니다.

  25. Blog Icon
    JudeSong

    이제 막 안드로이드 스튜디오 공부하고 있는데 구조를 이해하는데 매우 도움이 되었습니다. 감사합니다

  26. 방문해 주셔서 감사합니다.
    궁금한 점 있으면 언제든 댓글로 질문글 남겨주세요.

    감사합니다.

  27. Blog Icon
    soso

    static 일때는 this를 못쓰는데 그럼 어떻게해야 하나요?

  28. 아마 Intent 생성자의 this에 대해 질문하신 것 같은데, 맞나요?

    본문 예제에서 Intent를 사용한 것은, 특정 컴포넌트, 즉, 특정 액티비티에 인텐트를 보내기 위해 아래의 생성자를 통해 인텐트 객체를 생성한 것입니다.

    Intent(Context packageContext, Class<?> cls)

    첫 번째 파라미터에 전달될 Context를 위해 this를 사용한 것이죠.

    여기서, 중요한 점은 this 키워드 자체가 아니라, Context에 대한 참조, 즉, 액티비티 참조를 전달해야 한다는 것입니다.

    그렇다면 해결 방법에 대한 접근은, static 메서드에서 this를 어떻게 사용하는지가 아니라, static 메서드에서 액티비티를 어떻게 참조할 것인지가 되어야 합니다.

    음, 뭐 간단하게, static 메서드에 액티비티의 참조를 파라미터로 전달하거나, 액티비티를 직접 참조하도록 만들면 될 것 같은데, 그건 구현하시기 나름인 것 같습니다.

    답변이 되었는지 모르겠네요. 추가적으로 궁금한 내용이 있으면 질문글 남겨주세요.

    감사합니다.

  29. Blog Icon
    코드

    안녕하세요.
    질문이있습니다.
    혹시 클래스와 클래스를 연동할려고하는데
    예를 들어서 심장박동수를 체크하고 만약에 박동수가 80이하로 결과가 나온다면
    스피커가 출력되는 어플을 만들고 싶습니다.
    MainActivity.java에 심장박동수 코드를 기재하고
    Speaker.java에 스피커출력 코드를 기재했습니다.
    그 다음 해야 될것이
    심장박동수 80이하로 결과가 나오면 스피커가 자동출력하게 해야되는데
    어떤식으로 해야될지 궁금합니다

  30. 이 문제에 대한 답은, 제가 드리기가 힘들 것 같습니다.

    답이 정해진 문제도 아닐 뿐더러, 앱 설계와 관련된 질문에 답을 드리자면 댓글로는 설명드릴 방법이 없네요.

    일단 많은 예제들을 살펴보시고, 이것 저것 테스트 코드도 만들어보시고, 시행 착오를 거쳐보시길 바랄게요. 아니면 주변에 직접적으로 도움을 받을만한 분이 계시면 전체적인 구조 설계에 대해 도움을 받으시는 게 나을 것 같습니다.

    감사합니다.

  31. Blog Icon
    과객

    너무나도 감사드립니다. 한국에 있는 강좌중에 제일 나은것 같네요

  32. 과찬의 말씀이십니다.
    우연히, 찾으시는 내용이 정리되어 있었을 뿐이지요.
    앞으로 좀 더 유용한 내용들 채워나가도록 하겠습니다.
    방문해 주셔서 감사합니다.

  33. Blog Icon
    Sean

    따라 쳐보니까 이해가 되네요,, 정말 시중에 나온 책들 보다 나은듯 감사합니다!

  34. 칭찬글 남겨주셔서 감사합니다.

  35. Blog Icon
    박준성

    책을 보며 따라하다 이곳을 와보니 천국입니다.

  36. 부족한 내용에 과분한 칭찬글을 남겨주셨네요.

    방문해 주셔서 감사합니다.

  37. Blog Icon
    igoree

    처음 시작하는 사람에게 매우 적합한 설명과 예제네요. 굉장히 도움을 많이 받았습니다. 대단히 감사합니다.