onActivityResult ()가 조기에 호출되었습니다.


92

다음과 같이 내 작업자 활동에서 Activity(의 하위 항목 PreferenceActivity)을 시작합니다 .

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigure클래스에는 setResult()호출 이 없습니다 . 사실, MyConfigure클래스를 제외한 모든 코드가없는 OnCreate()이 사용하는 기본 설정을로드 어디 addPreferencesFromResource.

이제는 활동이 실행 된 직후 에 조기에 onActivityResult호출됩니다 . 1.6 및 2.1 에뮬레이터와 2.1 장치에서 테스트되었습니다. 어딘가에 묻 히라 는 전화가 있습니까? 아니면이 조기 호출을 어떻게 설명 할 수 있습니까?requestCode1458MyConfiguresetResult()PreferenceActivity


1
활동은 setResults ()에서 끝나지 않고 finish ()에서 끝납니다. MyConfigure 활동의 onCreate 메소드를 보여줄 수 있습니까?
Cheryl Simon

맞지 않습니다. 그러나 무언가가 미리 setResult ()를 호출하고 그것이 무엇인지 궁금합니다. onCreate의 코드는 간단합니다. public class MyConfigure extends PreferenceActivity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Eugene Mayevski '콜백

setResult가 호출되었음을 어떻게 알 수 있습니까?
RoflcoptrException

그것이 바로 제가 질문을 만든 것입니다. 알아보기 위해 onActivityResult가 조기에 호출되는 이유입니다.
Eugene Mayevski '콜백

이 기간 동안 logcat 출력은 무엇을 말합니까? 특히 호출되는 인 텐트를 보여주는 "ActivityManager"태그입니다.
Christopher Orr

답변:


254

이 문제는 시작 모드를 singleTop다음 으로 변경하여 해결되었습니다 .

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

Android에는 (활동이 계속 실행된다는 사실에도 불구하고 )로 Activity선언 된 singleTask( 아직 설정되지 않은) 결과를 즉시보고하는 버그 / 기능 (?)이 있습니다 . launchMode상위 활동을에서 singleTask로 변경하면 singleTop모든 것이 예상대로 작동합니다. 결과는 활동이 완료된 후에 만보고됩니다. 이 동작에는 특정 설명이 있지만 (하나의 singleTask활동 만 존재할 수 있고이를 위해 여러 명의 웨이터가 발생할 수 있음) 이것은 여전히 ​​저에게 논리적 제한이 아닙니다.


2
버그 인 것 같습니다! ^^ 매우 이상한 행동!
Felipe 2011

7
활동에 singleTask 시작 모드가있는 경우 onActivityResult를 사용하여 하위 활동에서 결과를받을 필요가 없습니다. 하위 활동은 finish ()를 호출 한 다음 데이터 의도로 기본 활동을 시작합니다. 기본 활동에서 onNewIntent 메소드를 재정의하고 수신 된 인 텐트를 처리해야합니다.

43
launchMode = "singleInstance"도이 동작을 유발합니다.
ffleandro

1
이것은 나를 위해 작동하지 않는 것 같습니다. 부모 활동에서 singleTop을 시도했지만 소용이 없었습니다. 요청이 이제 올바른 값을 표시하지만 결과는 항상 0입니다하지만 나는 또한, FLAG_ACTIVITY_SINGLE_TOP에 의도 플래그를 설정
네온 Warge

11
Kitkat 4.4.4에서 발생하며 Lolipop에서는 발생하지 않습니다.
Somasundaram Mahesh

18

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);전화하기 전에 제거한 후 문제를 해결했습니다 fragment.startActivityForResult(intent, 0);.


1
감사합니다! 이것은 내 문제를 해결했습니다. 어딘가에 대한 설명이 있습니까?
Conner Harkness

이것에 대한 설명은 요즘 플래그에 대한 문서에 있습니다 "이 플래그는 호출자가 시작되는 활동의 결과를 요청할 때 사용할 수 없습니다". 설명은 아니지만 적어도 경고입니다!
Code Novitiate

4

내 활동에서 모든 사용자 정의 "android : launchMode"를 제거했고 모든 것이 매력처럼 작동했습니다. 안드로이드가 정확히 무엇을 이해하고 있는지 모를 때 이것을 바꾸는 것은 좋은 생각이 아닙니다. 안드로이드는 이런 식으로 약간 까다 롭습니다.


1

의도에 Intent.FLAG_RECEIVER_FOREGROUND플래그가 설정 되었을 때 이런 일이 발생했습니다 .

(예, 해당 플래그는 활동과 관련이 없지만 다른 문제 에 대한 샷건 솔루션의 일부로 모든 의도에 포함되었습니다 .)


-1

Mayra의 의견에서와 마찬가지로 setResult()문제와 관련이 없습니다. 어떤 이유로 MyConfigure클래스는 자체적으로 완료되고 발생 하면 코드를 작성한 방법이기 때문에 PreferenceActivity결과가있을 수 있다고 가정합니다 MyConfigure.

이것은 startActivityForResult()...로 시작된 모든 활동을 강제로 되돌릴 때도 발생합니다 .

그래서 MyConfigure수업이 왜 강제로 끝났 는지에 초점을 맞추는 것이 낫다고 생각합니다 .


MyConfigure 클래스가 완료되지 않았습니다. 추측이 잘못되었습니다. 죄송합니다. 그렇다면 질문이 없을 것입니다
Eugene Mayevski '콜백
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.