早期に呼び出された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で呼び出されるrequestCode1458直後、途中でMyConfigureアクティビティが実行されます。1.6および2.1エミュレーターと2.1デバイスでテスト済み。setResult()どこかに埋葬するようにという呼びかけはありPreferenceActivityますか?または、この時期尚早の電話を他にどのように説明できますか?


1
アクティビティはsetResults()ではなく、finish()で終了します。MyConfigureアクティビティのonCreateメソッドを表示できますか?
シェリルサイモン

そうですね。しかし、何かが事前にsetResult()を呼び出すので、それが何であるか疑問に思っています。onCreateのコードは簡単です。パブリッククラスMyConfigure extends PreferenceActivity {@Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); }}
Eugene Mayevski 'Callback

setResultが呼び出されたことをどのように知っていますか?
RoflcoptrException-2010

それはまさに私が質問を作成したものです。調べるために、なぜonActivityResultが時期尚早に呼び出されるのか。
Eugene Mayevski 'Callback

この期間のlogcatの出力は何と言っていますか?具体的には、呼び出されているインテントを示す「ActivityManager」タグ。
Christopher Orr

回答:


254

これは、起動モードをsingleTop次のように変更することで修正されます。

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

Androidにはバグ/機能(?)があり、の結果(まだ設定されていない)がすぐに報告Activityされ、singleTask(アクティビティが実行され続けているにもかかわらず)と宣言されています。launchMode親アクティビティをからsingleTaskに変更するとsingleTop、すべてが期待どおりに機能します。結果は、アクティビティが完了した後でのみ報告されます。この動作には一定の説明がありますが(1つのsingleTaskアクティビティのみが存在し、そのために複数のウェイターが発生する可能性があります)、これは私にとって論理的な制限ではありません。


2
バグのようです!^^非常に奇妙な行動!
フェリペ

7
アクティビティにシングルタスク起動モードがある場合、onActivityResultを使用してサブアクティビティから結果を受け取る必要はありません。サブアクティビティは、finish()を呼び出し、データインテントでメインアクティビティを開始します。メインアクティビティでは、onNewIntentメソッドをオーバーライドして、受信したインテントを処理する必要があります。
Nik

43
launchMode = "singleInstance"もこの動作を引き起こします
ffleandro

1
これは私にはうまくいかなかったようです、私は親の活動でsingleTopを試しましたが、役に立ちませんでした。要求が正しい値を示すが、結果は常に0であるが、私はまた、FLAG_ACTIVITY_SINGLE_TOPに意図フラグを設定
ネオンWarge

11
Kitkat 4.4.4で発生しますが、Lolipopでは発生しません。
Somasundaram Mahesh 2015

18

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);呼び出す前に削除して問題を解決しましたfragment.startActivityForResult(intent, 0);


1
ありがとうございました!これは私の問題を解決しました。これについての説明はどこかにありますか?
Conner Harkness 2017

最近のフラグのドキュメントに、これに関する説明があります。「このフラグは、呼び出し元が起動中のアクティビティからの結果を要求しているときは使用できません」。まあそれは説明ではなく、少なくとも警告です!
コードノビエート

4

アクティビティからすべてのカスタム "android:launchMode"を削除したところ、すべてが魅力的に機能しました。Androidが何を理解しているかが正確にわからない場合は、これを変更することはお勧めできません。Androidはこのように少しトリッキーです。


1

これは、インテントにIntent.FLAG_RECEIVER_FOREGROUNDフラグが設定されているときに起こりました。

(はい、そのフラグはアクティビティに関連するものではありませんが、別の問題に対するショットガンソリューションの一部として、すべての意図にフラグを設定しまし。)


-1

再びメイラのコメントのsetResult()ように、あなたの問題とは何の関係もありません。なんらかの理由で、MyConfigureクラスはそれ自体が終了し、それが発生したときは、コードを記述した方法でPreferenceActivity結果が得られると想定しMyConfigureます。

これは、開始したアクティビティを強制的に戻すときにも発生しますstartActivityForResult()...

だから、なぜMyConfigureクラスが強制終了されたのかを考えたほうがいいと思います。


MyConfigureクラスが終了しません。推測が間違っています。申し訳ありません。それがあったとしても、疑いの余地はありません
Eugene Mayevski 'Callback
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.