안드로이드 액티비티 실행하기. (Starting Android Activity)
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" 메뉴 선택.
"New Resource File" 다이얼로그가 나타나면 XML 파일 이름을 입력하고 "OK" 버튼을 선택합니다.
[STEP-1.5] "New Resource File" 다이얼로그에 클래스 이름 입력.
새로 추가한 "activity_new.xml" 파일이 "/res/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의 상관 관계를 나타내는 관계도입니다.
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)가 실행되는 것을 확인해보겠습니다.
하지만 아래와 같은 에러 메시지가 출력되는 것을 확인할 수 있을 것입니다.
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가 정상적으로 실행되는 것을 확인할 수 있습니다.
또한 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"에 직접 이름을 입력하면 됩니다.
위에서 설명한 모든 파일들이 자동으로 생성되는 것을 확인할 수 있습니다.
4. 참고
- Activity에 대한 자세한 도움말.
- [안드로이드 개발 API 가이드 - 작업(activities)]을 참고하세요.
- [안드로이드 개발 참조문서 - Activity]을 참고하세요.
- 안도로이드 액티비티 개요.
- [안드로이드 액티비티]를 참고하세요.
.END.
'ANDROID 프로그래밍 > ACTIVITY' 카테고리의 다른 글
안드로이드 액티비티에서 데이터 가져오기. (How to get data from an Android Activity) (37) | 2016.09.28 |
---|---|
안드로이드 액티비티에 데이터 전달하기. (How to transfer data to an Activity) (17) | 2016.09.01 |
안드로이드 액티비티. (Android Activity) (39) | 2016.08.04 |