mojo's Blog

액티비티와 인텐트의 기본 본문

Android

액티비티와 인텐트의 기본

_mojo_ 2021. 9. 4. 15:35

안드로이드의 4대 컴포넌트

안드로이드의 4대 컴포넌트는 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더이다.

 

1. 액티비티 => 화면을 구성하는 가장 기본적인 컴포넌트로 지금까지 계속 액티비티를 이용하여 앱을 작성했다.

 

2. 서비스 => 눈에 보이는 화면과 상관없이 백그라운드에서 동작하는 컴포넌트이다. 백신 프로그램처럼 눈에 보이지는 않지만 계속 동작하고 있다. 로컬에서 동작하는 서비스는 세 단계를 거친다. ( 서비스 생성 => 서비스 시작 => 서비스 종료 )

 

3. 브로드캐스트 리시버 => 안드로이드는 여러 응용 프로그램이나 장치에 메시지를 전달하기 위해 방송 메시지를 사용한다.안드로이드는 문자 메시지 도착, 배터리 방전, SD 카드 탈부착, 네트워크 환경 변화 등이 발생하면 전체 응용 프로그램이 들을 수 있도록 방송 신호를 보낸다.그리고 브로드캐스트 리시버(Broadcast Receiver)는 이러한 방송 메시지가 발생하면 반응한다.

 

4. 콘텐트 프로바이더 => 응용 프로그램 사이에 데이터를 공유하기 위한 컴포넌트이다. 안드로이드 응용 프로그램은 데이터에 자신만 접근할 수 있으므로 자신의 데이터를 외부에 공개하려면 콘텐트 프로바이더(Content Provider)를 만들어야 한다.콘텐트 프로바이더의 정보를 제공하는 방법으로는 URI가 있다.콘텐트 프로바이더에서 처리된 데이터는 보통 데이터베이스나 파일로 저장된다.

 

액티비티의 개요

 

액티비티는 안드로이드폰에 나타나는 화면 하나하나를 말한다.

액티비티는 사용자에게 보여주는 화면을 만들기 때문에 안드로이드의 4대 컴포넌트 중에 가장 핵심적인 요소이다.

 

안드로이드 프로젝트를 생성할 때 activitiy_main.xml과 MainActivity.java로 파일 이름을 지정했다.

activity_main.xml은 화면을 구성하는 코드로 되어 있지만 activity_main.xml이 아니라 MainActivity.java가 액티비티에 해당된다.

activity_main.xml이 필요한 경우 MainActivity.java에서 setContentView(R.layout.activity_main)로 화면을 불러와 사용했다.

액티비티 하나당 화면을 하나씩 생성할 수 있는데 이번에는 액티비티를 추가해서 사용해본다.

일반적으로 액티비티 하나당 XML 파일 하나를 만들어서 사용한다.

 

연습) 새로운 액티비티 추가하기

 

activity_main.xml Code

 

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

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="새 화면 열기"
        android:id="@+id/btnNewActivity"/>

</LinearLayout>

 

second.xml Code

 

<?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:background="#00ff00">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btnReturn"
        android:text="돌아가기"/>

</LinearLayout>

 

MainActivity.java Code

 

public class MainActivity extends AppCompatActivity {
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("연습하기");

        btn = (Button)findViewById(R.id.btnNewActivity);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

 

SecondActivity.java Code

 

public class SecondActivity extends AppCompatActivity {
    Button btn;

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        setTitle("연습");

        btn = (Button)findViewById(R.id.btnReturn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

 

AndroidManifest.xml 파일에서 Second Activity 를 등록해야 한다. (안하면 Error)

 

<activity android:name=".SecondActivity" android:label="Second 액티비티"/>

 

명시적 인텐트

 

intent는 안드로이드의 4대 컴포넌트가 서로 데이터를 주고받기 위한 메시지 객체이다.

명시적 인텐트와 암시적 인텐트로 구분할 수 있는데 먼저 명시적 인텐트를 살펴보도록 한다.

 

명시적 인텐트는 다른 액티비티의 이름을 명확히 지정할 때 사용하는 방법이다.

putExtra() 메소드를 이용하여 필요한 만큼 데이터를 인텐트에 넣고 다음 startActivity() 메소드로 인텐트를 다른 액티비티로 넘길 수 있다.

그리고 인텐트를 받은 액티비티에서는 getStringExtra(), getIntExtra(), getBooleanExtra() 등의 메소드를 넘어온 데이터에 접근할 수 있다.

 

연습하기 ) 명화 선호도 투표 앱 만들기

 

activity_main.xml Code

 

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="3">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv1"
            android:src="@drawable/apple"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv2"
            android:src="@drawable/bear"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv3"
            android:src="@drawable/cherry"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="3">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv4"
            android:src="@drawable/rabbit"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv5"
            android:src="@drawable/lion"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv6"
            android:src="@drawable/cat"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="3">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv7"
            android:src="@drawable/dog"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv8"
            android:src="@drawable/kitty"/>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:id="@+id/iv9"
            android:src="@drawable/oreo"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/btnNext"
            android:text="투표 종료"/>
    </LinearLayout>

</LinearLayout>

 

second.xml Code

 

<?xml version="1.0" encoding="utf-8"?>
<TableLayout 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_vertical"
    android:stretchColumns="0">

    <TableRow>
        <TextView
            android:id="@+id/tv1"
            android:text="그림1"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar1"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/tv2"
            android:text="그림2"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar2"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/tv3"
            android:text="그림3"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar3"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/tv4"
            android:text="그림4"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar4"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/tv5"
            android:text="그림5"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar5"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/tv6"
            android:text="그림6"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar6"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/tv7"
            android:text="그림7"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar7"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/tv8"
            android:text="그림8"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar8"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <TextView
            android:id="@+id/tv9"
            android:text="그림9"
            android:layout_gravity="center_vertical"
            android:textSize="15dp"/>
        <RatingBar
            android:id="@+id/rbar9"
            style="?android:attr/ratingBarStyleIndicator"
            android:layout_gravity="right"/>
    </TableRow>

    <TableRow>
        <Button
            android:id="@+id/btnReturn"
            android:layout_span="2"
            android:text="돌아가기"/>
    </TableRow>

</TableLayout>

 

MainActivity.java Code

 

public class MainActivity extends AppCompatActivity {
    Button btn;
    ImageView img[] = new ImageView[9];
    Integer imageId[] = {R.id.iv1, R.id.iv2, R.id.iv3,
                          R.id.iv4, R.id.iv5, R.id.iv6,
                          R.id.iv7, R.id.iv8, R.id.iv9};
    final String imageName[] = {"사과", "배", "체리",
                                "토끼", "라이언", "고양이",
                                "개","키티","오레오"};
    final int voteCount[] = {0, 0, 0,
                             0, 0, 0,
                             0, 0, 0};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("연습하기");

        for(int i=0; i<imageId.length; i++){
            img[i] = (ImageView)findViewById(imageId[i]);
            final int index = i;
            img[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    voteCount[index]++;
                    Toast.makeText(getApplicationContext(), imageName[index]+": 총 "+voteCount[index]+" 표",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }

        btn = (Button)findViewById(R.id.btnNext);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                intent.putExtra("VoteCount",voteCount);
                intent.putExtra("ImageName", imageName);
                startActivity(intent);
            }
        });
    }
}

 

SecondActivity.java Code

 

public class SecondActivity extends AppCompatActivity {
    Button btn;
    TextView tv[] = new TextView[9];
    int textId[] = {R.id.tv1, R.id.tv2, R.id.tv3,
                    R.id.tv4, R.id.tv5, R.id.tv6,
                    R.id.tv7, R.id.tv8, R.id.tv9,};
    RatingBar rBar[] = new RatingBar[9];
    int rBarId[] = {R.id.rbar1, R.id.rbar2, R.id.rbar3,
                    R.id.rbar4, R.id.rbar5, R.id.rbar6,
                    R.id.rbar7, R.id.rbar8, R.id.rbar9,};

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        setTitle("연습");

        Intent intent = getIntent();
        int []voteCount = intent.getIntArrayExtra("VoteCount");
        String []imageName = intent.getStringArrayExtra("ImageName");

        for(int i=0; i<tv.length; i++){
            tv[i] = (TextView)findViewById(textId[i]);
            tv[i].setText(imageName[i]);
            rBar[i] = (RatingBar)findViewById(rBarId[i]);
            rBar[i].setRating(voteCount[i]);
        }

        btn = (Button)findViewById(R.id.btnReturn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

 

'Android' 카테고리의 다른 글

안드로이드 프로그래밍 제 10장 연습문제 6번  (0) 2021.09.04
액티비티와 인텐트 응용  (0) 2021.09.04
안드로이드 프로그래밍 제 9장 연습문제 (5, 6번)  (0) 2021.09.02
Bitmap  (0) 2021.09.02
Graphic  (0) 2021.09.02
Comments