Android-startActivityForResultがすぐにonActivityResultをトリガーする


144

私はアプリのメインアクティビティから呼び出しを使用してアクティビティを起動していますstartActivityForResult(intent, ACTIVITY_TYPE)が、1つを除いてすべて機能しています。

これを呼び出すと、必要に応じてアクティビティが起動されますが、ログonActivityResult()ですぐにトリガーされていることがわかります。アクティビティが表示されますがRESULT_CANCELED、すぐにに戻りonActivityResult()ます。

次に、アクティビティを操作し、を呼び出しfinish()onActivityResult()今回は呼び出されないボタンを押します(明らかに結果が既に返されているためです)。

これは誰にとっても意味がありますか?誰かが以前にこの動作を見たことがありますか?

回答:


315

startActivityForResult()アクティビティがsingleInstanceまたはとして起動されている場合は使用できませんsingleTaskstandardまたはsingleTop起動モードで問題が修正されます。


2
両方の人に感謝します。マニフェストファイルにこれを
記述し、

9
うわー!これはjavadocsに追加する明らかなことのようです!私はこれを動作させるために一晩中無駄にしており、このSOの回答は私のアクティビティがsingleTopに設定されていることを思い出させました。
スウビー、2013年

20
singleTop私にsingleTaskは問題ないように見えますが、この問題を引き起こしていたためsingleInstance、間違いなくそうなります
ダーンメイソン2013年

4
これをデバッグするのにも時間がかかりすぎました!ありがとう!!
suomi35 2013

4
私の場合、どのクラスもsingleInstanceまたはsingleTopとして定義していませんでしたが、それでも発生しています...提案はありますか?
CoDe 2014

110

さらに、インテントにIntent.FLAG_ACTIVITY_NEW_TASKセットがないことを確認してください。

ドキュメントから:

呼び出し元が起動中のアクティビティからの結果を要求している場合、このフラグは使用できません。


3
これで私の問題は解決しました。この問題は、singleInstance、singleTop、singleTaskが原因ではありませんでした。
Diana

あなたはミント(命の恩人)です。ユーザーにフラグメントで画像をキャプチャしてほしいと思ったとき、これは私の正確な問題でした
kyay

@ダイアナ、代わりに何を使ったか覚えていますIntent.FLAG_ACTIVITY_NEW_TASKか?
Keselme

@Keselme申し訳ありませんが、久しぶりです。お役に立てれば幸いですが、覚えていません。そのコードにアクセスできなくなりました。
ダイアナ

はい、修正しました。startActivityForResultをIntent.FLAG_ACTIVITY_NEW_TASKと一緒に使用しないでください
hanilozmen

21

以前にこの動作を見たことがあります。宛先アクティビティ(その特別なアクティビティ)がsingleInstanceAndroidManifestファイルにないことを確認してください。アクティビティがの場合、起動singleInstanceするRESULT_CANCELED前に戻ります。


18

また、外部アプリを呼び出すことができることを追加したいと思います。これにより、デフォルト
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Intent.FLAG_ACTIVITY_NEW_TASK追加されたインテントが作成されるため、次のように呼び出します。これにより
in.setFlags(0);
、フラグがクリアされ、次に進むことができます。startActivityForResult(in, action);

私がこれをしている理由は、他のいくつかのアプリ間で共通の機能を備えたユーティリティアプリがあり、コードの変更を複数の更新について心配する代わりに1つの場所に保持できるためです。


これは古いことはわかっていますが、これは非常に貴重なことでしたので、ユーザーに感謝したいと思います。また、アクティビティの間をジャンプしている人には、これが恐ろしい金であると指摘しました。ハッカソン中に私のお尻を保存しました;)
ウェスウィン

これはもっと注意が必要なことです。これは最良のソリューションであり、私にとっては完璧に機能します。あなたは私に多くの時間を節約してくれました、本当にありがとう。
Aritra Roy 2015

これは私が今朝抱えていた正確な問題だったので、この回答を賛成投票してください!解決策をありがとう!
ウィルジョンソン

ありがとう。intent.setFlags(0)が問題を解決しました。これで、2番目のアプリは正常に起動し、呼び出し元のアプリに結果を返します
Niaz

5

startActivityForResult()AndroidのプレロリポップバージョンのsingleInstanceまたはsingleTaskアクティビティでは機能しません。Android 5以降で動作します(詳細については、この回答を参照してください)。


5

またFLAG_ACTIVITY_NEW_TASK、あなたが意図している場合にもトリガーされます。

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

ありがとう。アクティビティにFLAG_ACTIVITY_NEW_TASKを追加しました。
Chirag Savsani 2017年

1

私の問題は呼び出し活動にありました。AndroidManifestでの宣言には、次のプロパティがあります。

android:noHistory="true"

これを「false」に変更し、正常に動作するようになりました。


1

Android 4.4には、アクティビティクロージャの最後に戻るのを待つことに関する小さな問題があります。この動作を解決するには、以下を設定することが重要です。

  • すべてのアクティビティは同じタスクアフィニティ属性を持ちます。(TaskAffinity = "[SAME STRING]"
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

このソリューションはすべてのバージョンのAndroidで動作します

taskAffinityについては、こちらをご覧ください。https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072


1

また、マニフェストのアクティビティでandroid:noHistory = "true"かどうかを確認します。そうであれば機能しません。


0

以下のためActivityGroupまたはTabHostその他、多分xxxActivityあるsubActivity親の。次に、startActivityForResultは機能しませんが、親は結果を取得できます。

  1. getParent().startActivityForResult()サブアクティビティからの呼び出し

  2. 親(ActivityGroup)がを処理できるようになりonActivityResultます。そこで、のサブクラスを作成し、ActivityGroupこれを処理しましたonActivityResult

  3. 必要に応じて、結果を再ルーティングしてサブアクティビティに戻すことができます。だけで現在のアクティビティを取得しgetLocalActivityManager().getCurrentActivity()ます。私のサブアクティビティはカスタムアクティビティを継承するhandleActivityResult(requestCode, resultCode, data)ため、ActivityGroupを呼び出すためにそのサブクラスにを追加しました。

例:http : //www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


デフォルトのWebブラウワーを呼び出すときには、この特殊なケースについてどう思いますか: codeproject.com/Questions/990063/...
アフマド・エブラヒミ

0

onActivityResult()マニフェストファイルでパッケージ名またはクラス名のスペルを間違えRESULT_CANCELEDresultCode場合も、として渡されます。


0

Androidマニフェストでandroid:launchMode="singleTop"、結果で開くアクティビティに設定し、アクティビティ設定フラグを開くintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

android:noHistory="true"AndroidManifest.xmlのアクティビティで定義した場合、同じ問題がここで発生します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.