1. 서론

검색을 해보면 다른 엑티비티에서의 활동에서 결과를 가져오기 위해 과거에 startActivityForResult함수가 이용되는 것을 알 수 있는데 실제로 안드로이드 스튜디오에서 확인해보니 startActivityForResult (deprecated) 라며 새로운 API로 마이그레이션이 필요하다고한다. 그런데 새 API의 설명이 공식 문서와 최근에 올라온 블로그의 글만 가지고는 이해가 어려워 작성하기로했다.

 

2. 사용법

0. build.gradle에 

implementation "androidx.activity:activity:1.2.0-alpha04"
implementation "androidx.fragment:fragment:1.3.0-alpha04"

를 추가해준다.

 

MainActivity.Java

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
public class MainActivity extends AppCompatActivity {
 
    ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if(result.getResultCode() == RESULT_OK) {
                    Intent intent = result.getData();
                    Log.d("MainActivity", intent.getStringExtra("result"));
                }
            }
    );
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        findViewById(R.id.mainButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SubActivity.class);
                intent.putExtra("key""value");
                mStartForResult.launch(intent);
            }
        });
    }
}
cs

1. 데이터를 받을 엑티비티에서 ActivityResultLauncher mStartForResult를 정의한다. (콜백 함수가 포인트이다)

그리고 새로운 엑티비티를 활성화 할때 startActivity가 아닌 ActivityResultLauncher함수의 launch를 이용하여 엑티비티를 활성화한다.

 

 

SubActivity.Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SubActivity extends AppCompatActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);
 
        Log.d("SubActivity""onCreate: "+getIntent().getStringExtra("key"));
        findViewById(R.id.subButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SubActivity.this, MainActivity.class);
                intent.putExtra("result","resultData");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}
 
cs

2. 데이터를 전송할 엑티비티에서 Intent에 자료를 저장한다.

꼭 setResult를 호출하여 결과를 설정한다.

 

3. 서브엑티비티 종료후 메인엑티비티로 돌아올시 ActivityResultLauncher로 작성한 콜백함수가 작동하여 필요한 데이터를 가져와 결과를 처리한다.

 

참고 : https://developer.android.com/training/basics/intents/result?hl=ko

 

활동에서 결과 가져오기  |  Android 개발자  |  Android Developers

개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를 들어, 앱에서 카메라 앱

developer.android.com

 

1. 개요

엑티비티간 데이터 통신을 위한 Intent라는 도구를 이용한다.

A엑티비티에서 Intent에 데이터를 저장 한 후

B엑티비티에서 Intent에 저장되어있는 데이터를 불러와 처리를한다.

 

2. 사용

MainActivity.Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        findViewById(R.id.mainButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SubActivity.class);
                intent.putExtra("key""value");
                startActivity(intent);
            }
        });
    }
}
cs

mainButton이라는 버튼 리스너에 Intent를 생성해 putExtra("key", "value")를 이용해 데이터를 저장한다.

그리고 startActivity로 새로운 엑티비티를 활성화 한다.

 

SubActivity.Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SubActivity extends AppCompatActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);
 
        Log.d("SubActivity""onCreate: "+getIntent().getStringExtra("key"));
        findViewById(R.id.subButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}
 
cs

활성화된 엑티비티에서 데이터를 불러오기위해 getIntent()를 사용한다.

그리고 get자료형Extra("key", "value") 로 자료를 불러오게 되는데 여기서 putExtra를 했던 자료형과 일치하지 않으면 에러를 발생하게 된다.

액티비티를 처음 작성하고 onCreate를 오버라이드하면
@Override

public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState)

형의 자동완성이 있는데 여기서 @Nullable PersistableBundle persistentState 이 파라미터를 받으면 액티비티에 아무것도 나오지 않게된다. 지워주자.

+ Recent posts