startActivityForResult를 사용하여 자식 활동에서 requestCode를 얻는 방법은 무엇입니까?


88

A, B, C 및 D의 네 가지 활동이 있습니다. 내 상황은 A가 startActivityForResult에 의해 활동 B를 시작한다는 것입니다.

startActivityForResult(new Intent(this,B.class),ONE);

다른 상황에서는 다른 상황에서 B를 할 것입니다. 처럼

 startActivityForResult(new Intent(this,B.class),TWO);

B에서는 requestCode에 따라 C 또는 D를 호출해야합니다. 즉 ONE이 C를 시작해야하고 D를 시작해야한다면
자식 Activity (여기 B)에서 requestCode를 확인하는 방법을 알아야합니다.
즉, Activity B가 시작된 요청 코드를 얻고 싶습니다.

답변:


140

추가로 요청 코드를 전달할 수 있습니다.

intent.putExtra("requestCode", requestCode);   

당신이 사용하는 경우 또는 startActivityForResult각을 편집하는 것보다 더 나은 다음 여러 번, 당신은 할 수 당신의에서 이 같은 당신에게 코드가 추가 overridestartActivityForResultActivity

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

그래서 모든에 startActivityForResult 편집 할 필요가 없습니다
당신을 도와 희망


51
자식 활동이 요청 코드를 얻을 수있는 방법이 정말 없습니까?
i_am_jorf

1
지금까지 최선을 다해 아는 한, 다른 방법은 없다고 생각합니다.
Labeeb Panampullan 2011 년

17
똑같은 것을 궁금해했습니다. 이것은 논리적으로 이해되지 않는 Android API의 것들 중 하나입니다.
Artem Russakovskii 2011

9
startActivityForResult는 다른 앱에서 활동을 시작하는 데 사용할 수 있으며 requestCode는 앱의 사적인 문제입니다. 이 관점에서 Intent에는 그러한 방법이 없으며 올바른 접근 방식은 Activity가 수행하기를 원하는 것을 정확하게 조언하는 setAction입니다.
Maciej Beimcik

28

요청 코드는이 값을 알 필요가없고 알 필요가 없기 때문에 시작된 활동에 자동으로 전달되지 않습니다. 시작 위치가 아니라 무엇을해야하는지 알면됩니다.

활동을 시작하는 것은 실제로 메서드를 호출하는 또 다른 형태입니다. 메서드를 호출하면 결과가 동 기적으로 수신됩니다 (호출 한 위치에서 바로). 이 경우 메서드가 작업을 수행하는 데 필요한 정보 만 전달합니다. 어디에서 전화했는지 말하지 않습니다.

활동을 시작하는 것은 메서드를 호출하는 비동기식 아날로그이며,이 경우 특수 메서드 onActivityResult ()에서 결과를받습니다. 이 방법에서는 방금받은 결과로 무엇을해야하는지 알아야하며 이에 대한 요청 코드가 있어야합니다.

요청 코드를 매개 변수로 전달하는 것이 좋은 생각이 아닌 이유를 좀 더 명확히하기 위해 구매할 수있는 제품을 보여주는 예제 활동을 고려하십시오. 이 활동에는 "구매"및 "로그인"이라는 레이블이 붙은 두 개의 버튼이 있습니다 (현재 로그인하지 않았으므로). "로그인"을 누르면 제공된 정보를 사용하여 사용자 로그인을 시도하는 "로그인"이라는 활동이 시작됩니다. "구매"를 누르면 먼저 동일한 "로그인"활동이 시작되고 로그인이 성공한 경우 구매 활동이 시작됩니다.

이제 "로그인"버튼은 요청 코드 1을 사용하여 로그인 활동을 시작하지만 "구매"버튼은 로그인이 성공하면 다른 작업을 수행해야하므로 동일한 요청 코드를 사용할 수 없습니다. 따라서 "구매"버튼은 요청 코드 2를 사용합니다.

"로그인"활동에서 호출 된 위치에 따라 두 개의 서로 다른 요청 코드를 수신 할 수 있지만 동일한 절차를 수행해야합니다.

따라서 요청 코드를 매개 변수로 전달하면 다음과 같이 몇 가지 다른 요청 코드에 대해 동일한 작업을 수행해야하는 코드가 생성됩니다.

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

또한 RequestCodes라는 클래스와 같은 중앙 위치에 요청 코드 상수를 저장하게됩니다.

요컨대, 요청 코드는 수신 된 결과로 무엇을 할 것인지 결정하는 데만 사용해야합니다. 이렇게하면 더 모듈화되고 유지 관리 및 코드 확장이 더 쉬워집니다.


1
일종의 "관리자"이고 특정 값 (추가에 저장된 값)을 "저장"하기 위해 요청 코드를 입력하려면 어떻게해야합니까? 값을 "검색"하고 추가로 반환하는 또 다른 요청 코드이지만이 활동 내에서 이름 변경, 편집, 삭제 등과 같은 저장된 값을 전체적으로 관리 할 수도 있습니다. 이와 같은 것에 대해 어떻게 생각하십니까? 동일한 작업을 수행하기 위해 코드 / 활동 복제를 방지 할 것이라고 생각합니다.
JRomero 2012

@ J.Romero 그렇게하지 마십시오. 그 기능을 (유틸리티 / 싱글 톤) 클래스에 넣으십시오. 또한보고 할 수 있습니다 처리기서비스
사볼 베 레츠

3
Szabolcs 자식 활동은 "이 값을 알 필요가 없더라도"체인의 다음 활동에 값을 전달해야 할 수 있습니다. 아이러니하게도이를 위해 더 많은 중복 코드를 작성해야합니다. 우리가 무엇을하지 말아야하는지에 대해 더 많은 강의를받는 것만 큼 우리가 알 필요가없는 것을 위해.
user250343

이것이 자식 활동이 요청 코드에 대한 액세스를 거부해야하는 이유를 어떻게 설명하는지 모르겠습니다. 나는 지금 구매하고 로그인 호출이 어쨌든 두 개의 개별 활동을 고려할 때 특정 예제에서 요청 코드에 액세스하는 것이 왜 필요한지 확실하지 않습니다.
Drazen Bjelovuk

1
@EvanR. 아마도 더 나은 아키텍처는 "마스터"항목 활동을 별도의 추가 / 편집 활동으로 하위 클래스 화하는 것입니다. 따라서 코드 재사용은 최소화되지만 각 활동은 독립적으로 호출 할 수 있습니다.
Dane Powell

11

사용자 지정 의도 작업을 사용하여 이러한 종류의 정보를 시작하는 활동에 전달했습니다.

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

그런 다음 다음과 같이 할 것입니다.

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

그리고 Activity에서 B쉽게 작업을 수행 할 수 있습니다.

getIntent().getAction();

정말 매력적이고 베스트 답변처럼 작동합니다. 감사.
YvesLeBorg

0

getCallingActivity ()를 사용하여 현재 활동을 시작하고 끝에 응답 코드가있는 결과 값을 수신하는 활동을 가져올 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.