마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

한 Activity에 다른 두개의 Activity에서 Intent 보낼때의 처리

0 추천
액티비티 C가 각각 다른 액티비티 A,B로부터 startActivityForResult를 이용하여 Intent를 받는 경우입니다.

이런 상황에서 A->C로 전환될때와 B->C로 전환될때 액티비티 C.java 안에서 각각 다른 코드를 실행시킬수 있나요?

예를들자면, 액티비티 C에 음악플레이어를 구현한 후  액티비티 A->C로 전환될때 와 B->C로 전환될때 Intent 인자로 각각다른 음성파일 path를 전달하여 C에서는 상황에따라 서로 다른 음성파일을 실행할수 있게 하고 추가적으로 각각 다른 작업까지 하고 싶습니다.

또한 그런 후에 C가 끝났을 때 A,B에서 onActivityResult로 받는 결과값도 서로 다르게 할 수 있나요?
lns0mnia (380 포인트) 님이 2021년 1월 17일 질문

2개의 답변

0 추천
 
채택된 답변

 

 

먼저 A에서 startActivityForResult  호출하실 때 다른 requestCoe를 사용하세요.

// startActivityForResult의 메소드 모양
public void startActivityForResult (Intent intent, 
                int requestCode)

//ActivityA
private static final String REQUEST_PLAY_MUSIC = 100; //임의의 값
private static final String REQUEST_PICK_AUDIO_FILE = 200; //임의의 값

// ActivityB 호출
startActivityForResult(intentPlayMusic, REQUEST_PLAY_MUSIC);

// ActivityC 호출
startActivityForResult(intentPickAudioFile, REQUEST_PLAY_MUSIC);

 

B와 C에서 결과값을 넘길 때,  Intent를 통해 결과값을 원하시는 대로 세팅해 주시면 됩니다.

// B와 C에서 A에 결과값을 전달할 때 호출할 함수
public final void setResult ( Intent data)

// ActivityB
setResult(RESULT_OK);
finish();

// ActivityC
Intent intent = new Intent();
intent.putExtra("fiilename", selectedAudioFileName);
setResult(RESULT_OK, );
finish();

 

ActivityA에서는 startActivityForResult할 때 사용했던 requestCode와 setResult를 통해 세팅했던 데이터를 전달받게 됩니다.

protected void onActivityResult (int requestCode, 
                int resultCode, 
                <a data-cke-saved-href="https://developer.android.com/reference/android/content/Intent" href="https://developer.android.com/reference/android/content/Intent">Intent</a> data) {

     if (resultCode != RESULT_OK) return;

     if (requestCode == REQUEST_PLAY_MUSIC) {
        // doSomething();
        return;
     }

    if (requestCode == REQUEST_PICK_AUDIO_FILE) {
        playAudioFile(data.getExtra("filename"));
        return;
     }
}

이런 식으로 데이터만 원하는 데이터로 잘 전달하시고 받는 쪽에서 넘어온 데이터가 원하는 데이터인지 체크하시면 됩니다.

 

spark (224,800 포인트) 님이 2021년 1월 17일 답변
lns0mnia님이 2021년 1월 18일 채택됨
@spark
빠르고 좋은 답변 정말 감사합니다!! ㅜㅜ
spark님의 답변을 읽고 제가 이해하기로는 A->B, A->C로 각각 Intent를 전달한 뒤 B와 C의 결과값을 A에서 onActivityResult로 받아와서 requestCode로 구분하는 것으로 보입니다. 제가 이해한 것이 맞다면 죄송하지만 조금 더 질문을 해도될까요? ㅜㅜ
제가 더 정확히 질문을 하자면 액티비티 A,B,C 가 있고 A와 B에서 모두 C로 화면전환이 되며 각각의 Intent를 전달해줍니다. 즉 A->C, B->C 의 화면전환과정입니다.  A에서 C로 전환되었을 때와, B에서 C로 전환되었을 때 C에서 각각 다른 동작을 하고싶습니다. 또한 C가 종료되면서 A->C의 경우일때는 A의 onActivityResult, B->C의 경우일때는 B의 onActivityResult를 호출하게 하고싶습니다. 이런경우는 어떻게 하면 될까요?
원하는 동작을 이미 알고 계시므로, 핵심은 startActivityForResult와  setResult를 위에서 말씀드린 대로 적절하게 사용하는 것입니다. 결과를 받고 싶은 쪽에서는 startActivityForResult로 결과를 세팅해줄 액티비티를 호출하면 되고, 결과를 세팅해줄 액티비티에서는 setResult를 를 사용하여 결과값을 전달합니다. 결과를 받은 액티비티에서 받은 결과값을 처리하는 것은 onActivityResult를 이용해서 하면 됩니다. 이 호출 흐름만 이해하시면 코드를 짜실 수 있습니다. 만약 흐름은 이해가는데 코드를 못짜시겠다면, 그건 자바나 코틀린 공부를 먼저 하셔야 하는 경우일 가능성이 높을 것 같습니다.
만약 코드가 왔다갔다 하는 부분이 헷갈리신 경우라면, ResultAPI라는 게 있습니다. 이걸 사용하셔도 돼구요. https://developer.android.com/training/basics/intents/result
0 추천

Q. 액티비티 A,B,C 가 있고 A와 B에서 모두 C로 화면전환이 되며 각각의 Intent를 전달해줍니다. 즉 A->C, B->C 의 화면전환과정입니다.  A에서 C로 전환되었을 때와, B에서 C로 전환되었을 때 C에서 각각 다른 동작을 하고싶습니다. 또한 C가 종료되면서 A->C의 경우일때는 A의 onActivityResult, B->C의 경우일때는 B의 onActivityResult를 호출하게 하고싶습니다. 이런경우는 어떻게 하면 될까요?

A: 고유한 request값으로 startActivityForResult로 C호출. onActivityResult에서 결과값 처리. 
B:
고유한 request값으로 startActivityForResult로 C호출. onActivityResult에서 결과값 처리. 
C: setResult로 호출한 액티비티 A나 C로 결과값 전달. 전달한 추가 데이터가 있으면 setResult 의 intent를 통해 전달.

호출하는 쪽(A, B)에서는 requestCode를 통해서, 결과 값을 전달하는 쪽(C)에서는 setResult의 intent를 통해 필요한 값을 전달하면 됩니다. 

제 설명이 부족하시면 개발자 문서에서 관련 페이지를 처음부터 꼼꼼히 읽어보세요. 예제 코들들도 있으니, 충분히 이해하실 수 있을 겁니다. 

spark (224,800 포인트) 님이 2021년 1월 18일 답변
진짜 자세하게 잘 설명주셔서 감사합니다!! spark님이 말씀하신대로 startActivityForResult와 setResult를 적절하게 잘 사용하면 금방 해결되는 문제였네요! A->C로 화면전환이 이루어질때는 B->C로 전환이 될때의 intent의 키값을 받아서 getIntent 하여도 null값이 들어가는 것을 이용하여 상황에 따라 다른 작업을 하도록 하여 해결했습니다. 또 결과값을 받을 때의 onActivityResult는 requestCode로 구분하면 바로 제가 원하는 상황을 만들수 있네요! 정말 많은 도움 되었습니다. 감사합니다!
...