인텐트(Intent)란?

이세인·2021년 7월 8일
0

do_it_안드로이드

목록 보기
2/3

생각해보면, 앱은 하나의 화면만으로 이루어질 수 없다. 여러 개의 화면이 있고, 화면과 화면 사이의 전환이 필요한데 어떻게 해결할까?

앱에는 Main, Menu 2가지 화면이 있고, main 화면의 버튼을 누르면 menu 화면으로 이동하고, menu 화면의 버튼을 누르면 다시 main 화면으로 이동하는 것을 구현해보겠다.


1. 일단 AndroidManifest.xml에 앱을 구성할 화면들을 등록해줘야 한다.

위는 앱이 두 개의 화면(MainActivity, MenuActivity)로 이루어져있을 때의 AndroidManifest.xml이다.
*추가 팁 - 만약 앱을 실행했을 때 MenuActivity 화면이 먼저 오게 하고 싶다면 위 코드에서 MenuActivity와 MainActivity 순서를 바꿔주면 된다.


2. MainActivity, MenuActivity를 Intent를 이용하여 작성한다.

아래는 MainActivity.java 소스코드이다.

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { //버튼을 누르면 menu화면을 띄우기
                Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
                startActivityForResult(intent, 101);
            }
        });
    }
}


사실 단순히 화면을 전환하기만 하는 것이라면 startActivity() 를 사용하면 되는데, 실제로는 원래의 화면으로 돌아올 때 데이터를 새로 적용해야 하는 경우가 많다.
따라서 단순히 새로운 액티비티를 띄우기만하는 것이 아니라 어떤 액티비티를 띄운 것인지, 띄웠던 액티비티로부터 다시 원래의 액티비티로 돌아오면서 응답을 받아 처리하는 코드가 필요하게 된다.

그래서 startActivityForResult() 를 사용하는 것!

위 코드의 startActivityForResult(intent, 101)에서 101은 액티비티를 구분하는 숫자코드라고 보면 된다.
--> menu화면에서 main으로 돌아올 때 101을 받는다는 것으로 이해하면 된다.

아래는 MenuActivity.java 소스코드이다.

public class MenuActivity extends AppCompatActivity {

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

        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("name", "mike");
                setResult(RESULT_OK, intent);
                
                finish();
            }
        });
    }
}

버튼2를 누르면 다시 main화면으로 넘어가게 된다.

사실 finish() 만 쓰면 main으로 돌아가는데, intent의 다른 기능을 이용해 보기 위해 추가코드를 넣었다.

Intent로는 화면을 담을 수 있을 뿐만 아니라, data를 담을 수 있다.
(위는 "name"이라는 이름의 key에 "mike"라는 값을 넣어서 보냄)

  • 그럼 이 data를 main에서 어떻게 받을까?

    onActivityResult() 함수를 이용. 이 함수는 다시 main으로 돌아오게 되면 자동으로 호출되는 함수!

아래 코드를 MainActivity.java에 추가한다.

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == 101){
            if (data != null){
                String name = data.getStringExtra("name");
                if (name != null){
                    Toast.makeText(this, "응답으로 받은 데이터 : " + name, Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

name이라는 이름의 data를 받아서 토스트로 띄우게 했다.

profile
Hongik CE

0개의 댓글