인텐트(intent)를 이용한 액티비티간 전환(화면 변경)

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

TextView textView = findViewById(R.id.hello_text);
textView.setText("안녕하세요");

findViewById(R.id.button).setOnClickListener( new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(this, SubActivity.class); // 이동할 액티비티를 입력변수로 사용
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra("EXTRA_MESSAGE", message); // Key-Value 형태로 데이터 저장하기
startActivity(intent); // 액티비티 이동
}
});
[SubActivity]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent = getIntent(); // 데이터 수신

// 변수 저장하기(From intent)
String message = intent.getExtras.getString("EXTRA_MESSAGE"); // 문자열
// intent.getExtras().getInt("EXTRA_MESSAGE"); // 숫자형
// intent.getExtras().getInt("EXTRA_MESSAGE"); // 숫자형
// intent.getExtras().getStringArray("EXTRA_MESSAGE"); // 배열형
// intent.getSerializableExtra("EXTRA_MESSAGE"); // 클래스형
});

버튼을 클릭하면 다른 화면이 표시되게 하고 싶을 때는 인텐트(Intent)객체를 사용해야 한다. 안드로이드를 구성하는 4대컴포넌트간(액티비티, 리시버, 프로바이더, 서비스)에 각종 의사전달에 사용되는 객체가 인텐트이다.

이번에는 액티비티간의 자료를 전달하는 것을 설명하고, 바로 ABA 이렇게 액티비티의 결과를 받은 경우에 사용되는 메소드에 대해서 알아보자.

우선 간단한 액티비티 전환(화면 변경)의 예제 소스이다. 전달한 값을 intent에 putExtra() 함수로 저장한 후, startActivity(intent) 호출하고, 호출되는 액티비티에서는 getIntent()로 intent를 받아 getExtras()로 자료를 추출한다.

 

- 화면을 구성하다보면, 액티비티간 이동을 ABA 이렇게 할 때가 있다. 위의 startActivity()을 할 경우, 사용자가 '뒤로가기' 버튼을 누르는 거나, 앱을 내렸다가 다시 화면을 띄우는 과정에서 예상치 못한 상황으로 결과를 잘못 받을 경우가 있어, startActivity() 대신 startActivityForResult()메소드 이용하고, BsetResult()로 결과 전송하고, AonActivityResult() 콜백 메소드가 호출되어, 전달받은 데이터를 받도록 처리해야 한다.

[Activity A]
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

public static final int REQUEST_CODE = 1000;
private EditText mNameEditText;
private EditText mAgeEditText;
private EditText mPhoneEditText;

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

mNameEditText = (EditText) findViewById(R.id.edit_name);
mAgeEditText = (EditText) findViewById(R.id.edit_age);
mPhoneEditText =(EditText) findViewById(R.id.edit_phoneNum);
findViewById(R.id.btn_call).setOnClickListener(this);
}

@Override
public void onClick(View v) {
Intent intent = new Intent(this, ActivityB.class);
intent.putExtra("name", mNameEditText.getText().toString());
intent.putExtra("age", mAgeEditText.getText().toString());
startActivityForResult(intent, REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE
&& resultCode == RESULT_OK
&& data != null) {
String result = data.getStringExtra("result");
Toast.makeText(ActivityB.this, result, Toast.LENGTH_SHORT).show();
}
}
}
[Activity B]
public class SecondActivity extends AppCompatActivity implements View.OnClickListener {

private TextView mMessageTextView;

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

Intent intent = getIntent(); // Activity A의 전달값 수신
String name = intent.getStringExtra("name");
String age = intent.getStringExtra("age");

mMessageTextView= findViewById(R.id.text_message);
mMessageTextView.setText(age + "살" + name);

findViewById(R.id.btn_result).setOnClickListener(this);
}

public void onClick(View v) {
Intent intent = new Intent(); // 결과를 전달할 준비
intent.putExtra("result", mMessageTextView.getText().toString()); // 결과값 저장
setResult(RESULT_OK, intent); // 결과값을 전달(Activity A)
finish();
}

}

다음에는 액티비티를 지정하지 않고, 암시적으로 Action 기반의 인텐트 이용방법에 대해 알아보고자 한다. 해당하는 Action 방식은 모바일의 연락처 이용, 전화걸기, 공유(카카오톡, 파일 이용) 등 다양하게 사용된다.

Posted by 목표를 가지고 달린다
,