안녕하세요
안드로이드 개발을 하다보면 액티비티에서 액티비티로 왔다갔다 경우 startActivity()와 startActivityForResult()를 사용하여 개발을 하는 경우가 많습니다
안드로이드를 많이 개발한 분들은 차이점에 대해서 설명을 안 해도 잘 아실텐데
시작 한지 얼마 되지 않은 분들은 잘 모를 수 있습니다
저도 이번에 블로그에 포스팅을 하면서 제대로 정리해봤습니다
이 두 메서드의 차이점에 대해서 알아보겠습니다
목차
Intent
startActivity
startActivityForResult
예제 코드
결과 화면
Intent
startActivity를 알아보기 전에 intent를 사용하여 어떻게 화면을 이동할지 정합니다
intent란?
파파고 번역기를 통해 번역하면 "의도", "흥미의" 이런 뜻입니다
Activity A 에서 Activity B로 이동을 할 때 intent를 사용하여 구현을 해줍니다
구문은 보통 이렇게 사용됩니다
현재 화면(this)에서 B 액티비티(SecondActivity)로 이동을 정의한 것입니다
Intent intent = new Intent(this, SecondActivity.class);
startActivity
이제 startActivity의 사용법에 대해서 알아보겠습니다
startActivity는 intent에서 정의한 두 개의 액티비티의 이동 액션을 수행합니다
문법은 그렇게 어렵지 않습니다
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
startActivityForResult
startActivityForResult에 대해서 알아보겠습니다
startActivity에 비하면 사용법이 약간 복잡합니다
이 문법은 액티비티간의 이동 이외에도 A Activity에서 B Activity로 데이터를 주고받는 것도 가능합니다
아래와 같이 intent 이외에도 requestCode를 넘겨줘야합니다
requestCode의 용도는 아래에서 설명하겠습니다
Intent intent2 = new Intent(this, SecondActivity.class);
startActivityForResult(intent2, 1000);
다른 폼에서는 아래와 같이 resultCode를 정의해서 결과를 setResult로 넘겨줍니다
Intent intent = new Intent();
intent.putExtra("ResultMsg", "startActivityForResult 테스트");
setResult(RESULT_OK, intent);
finish();
이제 넘겨준 결과를 받습니다
아래와 같이 onActivityResult를 사용하여 결과를 받아줍니다
위에 requestCode를 1000으로 정의했는데 onActivityResult에서 requestCode가 1000인것만 받도록 코드를 짰습니다
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1000) {
if (resultCode == RESULT_OK) {
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_OK : " + resultMsg, Toast.LENGTH_SHORT).show();
} else if (resultCode == RESULT_CANCELED) {
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_CANCELED : " + resultMsg, Toast.LENGTH_SHORT).show();
} else {
}
}
}
단계를 정의한다면
1. startActivityForResult(intet, requestCode)
2. setResult
3. onActivityResult(requestCode, resultCode, data
순으로 사용된다고 보면 됩니다
예제 코드
이제 제가 작성한 예제 코드를 알아보겠습니다!
먼저 화면 디자인입니다
1. activity_main.xml
버튼은 두 개로 구성하였습니다
"STARTACTIVITY" 버튼을 클릭하면 startActivity() 메소드를 탑니다
"STARTACTIVITYRESULT" 버튼을 클릭하면 startActivityForResult() 메소드를 타도록 구현했습니다
2. activity_second.xml
버튼은 세 개로 구성하였습니다!
"BACKPROCESS" 단순 뒤로 이동합니다
"ONRESULTBACKOK" ResultCode로 OK를 보냅니다
"ONRESULTBACKCANCEL" ResultCode로 CANCEL을 보냅니다
3. MainActivity.java
MainActivity에서 화면간 이동 startActivity와 startActivityForResult를 구현해서 액티비티간 이동을 시킵니다
package com.example.startactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
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 startActivity;
Button StartActivityResult;
// onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 메인 레이아웃 매핑
setContentView(R.layout.activity_main);
// 버튼 매핑
startActivity = findViewById(R.id.btnStartActivity);
StartActivityResult = findViewById(R.id.btnStartActivityResult);
// 버튼 클릭 이벤트 정의
startActivity.setOnClickListener(this);
StartActivityResult.setOnClickListener(this);
}
// 버튼 이벤트 정의
@Override
public void onClick(View v) {
switch (v.getId()) {
// startActivity()
case R.id.btnStartActivity:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
break;
// startActivityForResult()
case R.id.btnStartActivityResult:
Intent intent2 = new Intent(this, SecondActivity.class);
startActivityForResult(intent2, 1000);
break;
}
}
// startActivityForResult 결과 return
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// requestCode가 1000인 경우
if (requestCode == 1000) {
// OK 이벤트
if (resultCode == RESULT_OK) {
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_OK : " + resultMsg, Toast.LENGTH_SHORT).show();
// CANCEL 이벤트
} else if (resultCode == RESULT_CANCELED) {
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_CANCELED : " + resultMsg, Toast.LENGTH_SHORT).show();
// 그 외의 경우 디폴트 처리
} else {
}
}
}
}
4. SecondActivity.java
SecondActivity에서는 finish()를 사용하여 Activity를 종료합니다
대신 intent와 setResult를 통해서 finish를 처리할 때 MainActivity로 데이터를 넘겨주는 처리를 합니다
package com.example.startactivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends Activity implements View.OnClickListener {
// 디자인 변수 선언
Button backActivity;
Button backResultOK;
Button backResultCANCEL;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 메인 레이아웃 매핑
setContentView(R.layout.activity_second);
// 버튼 매핑
backActivity = findViewById(R.id.btnBack);
backResultOK = findViewById(R.id.btnResultBackOk);
backResultCANCEL = findViewById(R.id.btnResultBackCancel);
// 버튼 클릭 이벤트 정의
backActivity.setOnClickListener(this);
backResultOK.setOnClickListener(this);
backResultCANCEL.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 뒤로 가기
case R.id.btnBack:
Intent intent3 = new Intent();
setResult(9999999, intent3);
finish();
break;
// OK 버튼
case R.id.btnResultBackOk:
Intent intent = new Intent();
// ResultMsg : startActivityForResult 테스트 넘겨준다
intent.putExtra("ResultMsg", "startActivityForResult 테스트");
setResult(RESULT_OK, intent);
finish();
break;
// CANCEL 버튼
case R.id.btnResultBackCancel:
Intent intent2 = new Intent();
// ResultMsg : startActivityForResult 테스트 넘겨준다
intent2.putExtra("ResultMsg", "startActivityForResult 테스트");
setResult(RESULT_CANCELED, intent2);
finish();
break;
}
}
}
결과 화면
데이터를 주고받는 것이 성공적으로 이뤄진 모습입니다
Toast 메시지박스로 데이터가 출력된 모습입니다
startActivity와 startActivityForResult에 대해서 간단하게 설명하고 차이점에 대해서 알아봤습니다
이 글을 보는 안드로이드 개발자 분들께 도움이 되는 글이었으면 좋겠습니다 ㅎ
여기까지 포스팅을 마치겠습니다
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[Android Studio] 액션바(ActionBar)/타이틀바, 상태바(StatusBar) 숨기기 (0) | 2021.05.12 |
---|---|
[Android Studio] 디버깅 방법에 대해서 알아보자! (0) | 2021.05.10 |
[Android Studio] RuntimeException: Failure delivering result ResultInfo 에러 해결 (0) | 2021.05.08 |
[Android Studio] android.content.ActivityNotFoundException: Unable to find explicit activity class 에러해결방법 (2) | 2021.05.07 |
[Android Studio] 내부저장소/외부저장소 절대경로 가져오기 (1) | 2021.05.06 |