투케이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 [클래스 종료]
 

[결과 출력]

 

 

반응형
Comments