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.