Notice
Recent Posts
Recent Comments
Link
투케이2K
284. (AndroidStudio/android/java) 인텐트 데이터 전달 및 응답 데이터 확인 - ActivityResultLauncher 본문
Android
284. (AndroidStudio/android/java) 인텐트 데이터 전달 및 응답 데이터 확인 - ActivityResultLauncher
투케이2K 2022. 3. 23. 17:05[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : java
[사용 이유]
1. startActivityResult 메소드와 onActivityResult 메소드를 사용 시 메모리 부족으로 응답 데이터를 정상적으로 확인하지 못하는 문제 발생
2. startActivityResult 메소드 Deprecated 되어 대체 하기 위함
[A_First : 소스 코드]
package com.example.testapp;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
public class A_First extends AppCompatActivity {
/**
* TODO [클래스 설명]
* // -----------------------------------------
* 1. 인텐트 요청 및 응답 데이터 확인 액티비티
* // -----------------------------------------
* */
// TODO [빠른 로직 찾기 : 주석 로직 찾기]
/**
* // -----------------------------------------
* // [SEARCH FAST] : []
* // -----------------------------------------
*/
// TODO [전역 변수 선언 실시]
private static final String ACTIVITY_NAME = "A_First";
// TODO [컴포넌트 선언 실시]
Button intentButton; // [인텐트 이동 버튼]
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
// [타이틀바 없애기 : FEATURE_NO_TITLE]
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
catch (Exception e){
e.printStackTrace();
}
// [액티비티 레이아웃 지정 실시]
setContentView(R.layout.a_first_layout);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 액티비티 수행 실시]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// TODO [startActivityForResult 인텐트 응답 콜백 등록 실시]
// [import 필요]
// import androidx.activity.result.ActivityResult;
// import androidx.activity.result.ActivityResultCallback;
// import androidx.activity.result.ActivityResultLauncher;
// import androidx.activity.result.contract.ActivityResultContracts;
// -----------------------------------------
// -----------------------------------------
// TODO [컴포넌트 매핑 실시]
intentButton = (Button) findViewById(R.id.intentButton);
// -----------------------------------------
// -----------------------------------------
// TODO [버튼 클릭 이벤트 정의]
intentButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> intentButton :: 인텐트 이동 버튼 클릭 이벤트 발생]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [인텐트 이동 수행 실시]
Intent intent = new Intent(A_First.this, A_Second.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.putExtra("callData", "시작 메시지입니다."); // [데이터 전송]
resultLauncher.launch(intent); // [인텐트 이동 실시]
}
});
// -----------------------------------------
} // TODO [메인 종료]
// TODO [registerForActivityResult 인텐트 응답 콜백 등록 실시]
ActivityResultLauncher<Intent> resultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> registerForActivityResult() :: 인텐트 결과 확인]");
Log.i("","\n"+"[result :: [전체 데이터] :: "+String.valueOf(result)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// TODO [정상적으로 응답을 받은 경우]
if(result.getResultCode() == RESULT_OK){
// -----------------------------------------
// [인텐트 데이터 얻어온다]
Intent intent = result.getData();
// -----------------------------------------
// -----------------------------------------
// [setResult 에서 응답 받은 데이터 확인 실시]
String callData = intent.getStringExtra("callData");
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> registerForActivityResult() :: 인텐트 응답 데이터 확인]");
Log.i("","\n"+"[callData : "+String.valueOf(callData)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
}
}
});
// TODO [모바일 키 이벤트 발생 체크 부분]
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// [모바일 디바이스의 뒤로가기 키 이벤트가 발생한 경우]
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 발생]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
return true;
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onResume(){
super.onResume();
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 액티비티 실행 준비]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onPause(){
super.onPause();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPause() :: 액티비티 정지 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onDestroy(){
super.onDestroy();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onDestroy() :: 액티비티 종료 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
} // TODO [클래스 종료]
[A_Second : 소스 코드]
package com.example.testapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.Button;
public class A_Second extends AppCompatActivity {
/**
* TODO [클래스 설명]
* // -----------------------------------------
* 1. 인텐트 요청 및 응답 데이터 확인 액티비티
* // -----------------------------------------
* */
// TODO [빠른 로직 찾기 : 주석 로직 찾기]
/**
* // -----------------------------------------
* // [SEARCH FAST] : []
* // -----------------------------------------
*/
// TODO [전역 변수 선언 실시]
private static final String ACTIVITY_NAME = "A_Second";
// TODO [컴포넌트 선언 실시]
Button finishButton; // [인텐트 종료 버튼]
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
// [타이틀바 없애기 : FEATURE_NO_TITLE]
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
catch (Exception e){
e.printStackTrace();
}
// [액티비티 레이아웃 지정 실시]
setContentView(R.layout.a_second_layout);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 액티비티 수행 실시]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// TODO [인텐트로 넘어온 데이터 확인 실시]
Intent receiveIntent = getIntent();
String callData = receiveIntent.getStringExtra("callData");
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 인텐트로 넘겨 받은 데이터 확인]");
Log.i("","\n"+"[callData :: "+String.valueOf(callData)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// -----------------------------------------
// TODO [컴포넌트 매핑 실시]
finishButton = (Button) findViewById(R.id.finishButton);
// -----------------------------------------
// -----------------------------------------
// TODO [버튼 클릭 이벤트 정의]
finishButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> intentButton :: 인텐트 종료 버튼 클릭 이벤트 발생]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [액티비티 종료 및 StartActivityForResult 응답 코드 전송]
Intent intent = new Intent();
intent.putExtra("callData","종료 메시지입니다."); // [리턴 메시지 지정]
setResult(RESULT_OK, intent); // [인텐트 종료 코드 지정]
finish(); // [액티비티 종료]
overridePendingTransition(0,0);
}
});
// -----------------------------------------
} // TODO [메인 종료]
// TODO [모바일 키 이벤트 발생 체크 부분]
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// [모바일 디바이스의 뒤로가기 키 이벤트가 발생한 경우]
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 발생]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
return true;
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onResume(){
super.onResume();
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 액티비티 실행 준비]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onPause(){
super.onPause();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPause() :: 액티비티 정지 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onDestroy(){
super.onDestroy();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onDestroy() :: 액티비티 종료 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
} // TODO [클래스 종료]
[결과 출력]
반응형
'Android' 카테고리의 다른 글
Comments