본문 바로가기

프로그래밍/안드로이드

[안드로이드] 인텐트(Intent) 이용하기(2) - 명시적 인텐트(Explicit Intent)


안녕하세요 ! 초보개발자 입니다. 

이 블로그는 개인 공부 정리용 블로그 입니다. 

혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.

그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.

그럼 시작하도록 하겠습니다.




명시적 인텐트(Explicit Intent)


우리는 저번시간에 Intent를 이용하여 Main액티비티에서 새로 만든 액티비티로 이동하는 방법에 대해서 알아보았습니다. 그 때 보았던것과 같이 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에는 '명시적 인텐트' 라고 부릅니다. 


명시적 인텐트를 만드는 방법은 다음과 같습니다 .


Intent intent = new Intent(this,Activity2.class);


인텐트 객체의 첫번째 인자는 현재 자신의 엑티비티를 뜻합니다. 두번째 인자는 우리가 이동할 액티비티를 뜻합니다. 이렇게 명시적 인텐트는 호출할 것을 확실하게 알기 때문에 그렇게 어렵지는 않습니다. 액티비티를 실행하기 위해서는 startActivity()를 이용하는데 이는 단순히 액티비티를 호출하기만 하는 코드입니다. 그리고 또 다른 방법은 startActivityForResult() 를 이용하는 방법입니다. 이는 호출한 액티비티로부터 결과 값을 받을 수 있습니다.


startActivity() 를 이용하는 방법은 저번시간에 알아보았으니 예제를 이용하여 startActivityForResult()를 이용하는 법을 알아 보겠습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.example.administrator.intenttest;
 
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button activityStart;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        activityStart= (Button)findViewById(R.id.startActivity);
        activityStart.setOnClickListener(this);
 
    }
 
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this,Activity2.class);
        startActivityForResult(intent,200);
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 
        if(requestCode==200){
            Toast.makeText(getApplicationContext(),"requestCode = "+requestCode,Toast.LENGTH_SHORT).show();
 
        }
    }
}
 
cs


위의 소스는 Intent이용하기(1) 에서 이용한 MainActivity.java를 변형 한것입니다. xml은 동일합니다. startActivity가 startActivityForResult로 바뀌었습니다. 

startActivityForResult()에 전달되는 인자는 인텐트와 정수로 된 코드 값입니다. 이 정수로 된 코드 값은 각각의 액티비티를 구분하는데 사용이 됩니다. 즉 액티비티는 여러개가 있을 수 있으니 그 여러개의 액티비티를 구분하기 위한 값으로 이해 할 수 있습니다.  onActivityResult() 는 우리가 startActivity로 호출한 액티비티가 종료 되었을 때 실행이 됩니다. startActivityForResult의 두번째 인자 값을 200으로 주었기 때문에 200으로 어떤 액티비티를 호출하였는지 알 수 있습니다. 


다음은 Activity2 액티비티에서 Activity2를 호출했던 MainActivity로 데이터를 전달하는 방법에 대해서 알아 보겠습니다. 


Activity2의 코드는 다음과 같습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.example.administrator.intenttest;
 
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
public class Activity2 extends AppCompatActivity implements View.OnClickListener {
    Button finish ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
 
        finish = (Button)findViewById(R.id.finish);
        finish.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        Intent result = new Intent();
        result.putExtra("name","초보자바");
        setResult(RESULT_OK,result);
        finish();
    }
}
 
cs

 

인텐트를 생성하여 데이터를 전달하는 방법은 result.putExtra() 입니다. 저 함수는 키(key) 값과 데이터(data) 값을 쌍으로 넣어 주는 것입니다. 이 키(key)값을 이용하여 호출한 MainActivity에서 결과 값을 확인 할 수 있습니다. 

setResult 메소드는 현재 액티비티를 띄운 액티비티로 응답을 보낼 때 사용됩니다. 첫번째 인자인 RESULT_OK로 액티비티가 정상적으로 끝났음을 전달합니다. 그렇게 setResult로 호출한 액티비티로 값을 전달해주면 MainActivity에서는 다음과 같이 전달된 값을 읽을 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.example.administrator.intenttest;
 
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button activityStart;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        activityStart= (Button)findViewById(R.id.startActivity);
        activityStart.setOnClickListener(this);
 
    }
 
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this,Activity2.class);
        startActivityForResult(intent,200);
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 
        if(requestCode==200){
            if(resultCode==RESULT_OK) {
                Toast.makeText(getApplicationContext(),"Activity2로 부터 전달 받은 데이터 : "+data.getStringExtra("name"),Toast.LENGTH_SHORT).show();
            }
 
        }
 
    }
}
 
cs


정상적으로 코드가 입력 되었다면 Activity2를 호출한 후 종료하면 Toast알림에 우리가 전달한 '초보자바'를 띄우는 것을 볼 수 있습니다. 


이상으로 명시적 인텐트에 대해서 알아 보았습니다.