본문 바로가기
Android

[Android] Activity와 Intent

by jane.dev 2021. 10. 28.
반응형
Intent
메시징 객체로 다른 구성 요소로부터 작업을 요청하는데에 사용

 

인텐트와 구성 요소 간의 통신 방식은 크게 3가지,

  • 서비스 시작
  • 브로드캐스트 전달
  • 액티비티 시작

이 있는데, 다뤄볼 방식은 액티비티 시작

앱 내부의 단일 화면을 나타내는 Activity의 새 인스턴스를 시작하기위해 Intent를 startActivity()로 전달하면

Intent는 시작할 액티비티를 설명하고 모든 필수 데이터를 담음

 

실습

버튼을 통해 한 액티비티에서 다른 액티비티를 시작

<activity_main.xml

먼저 LinearLayout에 Button을 생성해 클릭이벤트로 다른 액티비트를 시작할 수 있게함

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="next"
        android:id="@+id/movetoSub1" />

</LinearLayout>

 

MainActivity.java

생성한 Button을 연결하고 onClick 이벤트 생성

public class MainActivity extends AppCompatActivity {

    Button movetoSub1;

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

        movetoSub1 = (Button)findViewById(R.id.movetoSub1);

        movetoSub1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), SubActivity1.class);
                startActivity(intent);
            }
        });
    }
}

OnClick 이벤트 내부에는 Intent 객체를 생성하고

첫번째 파라미터에는 ApplicationContext()를 가져오는 getApplicationContext()와

두번째 파라미터에는 이동할 페이지의 클래스를 작성 후 intent를 startActivity()에 전달

 

AndroidManifest.xml

onClick 이벤트에서 이동되는 페이지는 매니페스트 파일에 선언해줘야함

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.ict.activityprj2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ActivityPrj2">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 추가 -->
        <activity android:name=".SubActivity1" android:label="sub1" />
    </application>

</manifest>

Intent를 사용하면 Android 시스템에서는 시작할 적절한 구성요소를 찾는데, 이때 Intent의 내용을 기기에 있는 다른 앱의 매니페스트 파일에서 선언된 인텐트 필터와 비교하는 방법을 사용함

→ 해당 Intent와 일치하는 필터가 있으면 시스템이 해당 Activity의 onCreate()메서드를 호출하여 Intent 객체에 전달하고 일치하는 Activity를 시작함

 

activity_sub1.xml

LinearLayout 내부에 이전 액티비티로 돌아가는 Button 생성

<?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"
    android:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="activity_sub1.xml"
        android:textColor="@color/white" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="go back"
        android:id="@+id/backtoMain"/>

</LinearLayout>

 

SubActivity1.java

이전으로 되돌아가기위해 스택에 쌓여있던 화면 finish() 함수를 호출해 삭제

public class SubActivity1 extends AppCompatActivity {

    Button backtoMain;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub1);
      
        backtoMain = (Button)findViewById(R.id.backtoMain);

        backtoMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }
}

현재의 화면으로 넘어왔을때 Android 내부에서는 화면이 스택이라는 곳에 쌓임, finish()를 이용해 스택에서 제거

 

스택 내부

            이전                 →                현재               →             이후

                                            SubActivity

MainActivity     MainActivity     MainActivity