web-dev-qa-db-ja.com

onActivityResult()が時期尚早に呼び出された

次のように、ワーカーアクティビティからActivityPreferenceActivityの子孫)を開始します。

_@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クラスには、addPreferencesFromResourceを使用して設定をロードするOnCreate()以外のコードはありません。

これで、onActivityResultアクティビティが実行された直後に、requestCodeが_1458_のMyConfigureで呼び出されます。 1.6および2.1エミュレーターと2.1デバイスでテスト済み。 PreferenceActivityのどこかにsetResult()の呼び出しが埋め込まれていますか?または、この時期尚早の呼び出しを他にどのように説明できますか?

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

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

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

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

16
teapeng

アクティビティからすべてのカスタム「Android:launchMode」を削除したところ、すべてが魅力的に機能しました。 Androidが何を理解しているか正確にわからない場合、これを変更するのは得策ではありません... Androidはこの方法で少し注意が必要です。

4
Felipe

これは、インテントにIntent.FLAG_RECEIVER_FOREGROUNDフラグセット。

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

1
Sam