2017-08-04 11 views
2

まず、関連する質問のすべての回答が私の問題を解決しなかったので、私は新しい質問を作成しています。複数のチェーンアクティビティでonActivityResultがnullを返すたびに

私は2つのアプリを持っています。最初のアプリから、私はというURIでACTION_VIEWのインテントを呼び出しています。

2番目のアプリでは、同じURIのインテントフィルタを設定しました。

アクティビティBから、私はonActivityResultでApp2のアクティビティCを呼び出しています。

アクティビティCからアクティビティDをonActivityResultと呼んでいます。

アクティビティDで作業した結果、バンドル内のデータで結果が設定され、結果がOKに設定されます。

アクティビティCでこのデータを取得するのではなく、バンドル内のデータがnullのアクティビティBを対象としています。

アクティビティBは、App1のアクティビティAに同じ応答を送信しています。したがって、私はApp1にもnullデータを取得しています。要求の中で

、それに応答して

App1 (Activity A) ---> App2 (Activity B) ---> Activity C ---> Activity D 

Expected : App1 (Activity A) <--- App2 (Activity B) <--- Activity C <--- Activity D 

Actual : App1 (Activity A) <--- App2 (Activity B) <--- Activity D 
with data as null. 

は親切のApp1のアクティビティAにApp2の活動のDからデータを取得するために私を助けて。

CODE:

App1のアクティビティA:

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(Uri.parse(deepLinkUrl)); 
Intent chooser = Intent.createChooser(intent, title); 
if (intent.resolveActivity(getPackageManager()) != null) { 
    startActivityForResult(chooser, 1); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 1) { 
     if (data.getExtras() != null) { 
      Log.e("onActivityResult", "responseIntent.getExtras() " + 
        data.getExtras()); 
     } 
    } 
} 

App2のアクティビティB:

Constants.deeplinkUri = getIntent().getData(); 
Intent intent = new Intent(SplashActivity.this, LoginActivity.class); 
intent.setData(Uri.parse(Constants.deeplinkUri)); 
startActivityForResult(intent, 100); 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 100) { 
     if (data.getExtras() != null) { 
      Log.e("onActivityResult", "responseIntent.getExtras() " + 
        data.getExtras()); 
     } 
     setResult(Activity.RESULT_OK, data); 
     finish(); 
    } 
} 

App2の活動C:

Intent intent = new Intent(LoginActivity.this, PayActivity.class); 
intent.setData(Uri.parse(Constants.deeplinkUri)); 
startActivityForResult(intent, 100); 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 100) { 
     if (data.getExtras() != null) { 
      Log.e("onActivityResult", "responseIntent.getExtras() " + 
        data.getExtras()); 
     } 
     setResult(Activity.RESULT_OK, data); 
     finish(); 
    } 
} 

App2のアクティビティD:予め

Intent returnIntent = new Intent(); 
returnIntent.putExtra("result", msg); 
setResult(Activity.RESULT_OK, returnIntent); 
finish(); 

おかげ。 誰でも?

+0

まだヘルプが必要な場合は、[MCVE](http://stackoverflow.com/help/mcve)の投稿を検討してください。私はちょうどあなたの状況を再現するために2つのアプリケーションを設定し、可能な限り多くのコードを使用しています。すべてが完全に機能します(したがって、すべての要求コードが同じであれば問題ありません) – 0X0nosugar

+0

私のプロジェクト。 – Swapnil

+0

基本的には[this one](https://stackoverflow.com/a/37187855/5015207)と同じです。私は(B - > C)と(C - > D)の 'Intent'に' FLAG_ACTIVITY_FORWARD_RESULT'と 'startActivity()'を使用せず、代わりにあなたのコードをコピーしました。 (プラス私は自分のアクティビティAをトリガする小さなアプリを書いて、アクティビティAで 'onActivityResult()'を使ってすべてのものを他のアプリに戻していました)BTWでは、 "App2のアクティビティDから私の答えのアプローチは、あなたのユースケースの方が良いかもしれません。なぜなら、アクティビティCとBを途中でスキップするからです。 – 0X0nosugar

答えて

2

startActivityForResultを呼び出す際に問題が発生しました。

ActivityAから、このようなActivityBを起動しています。

startActivityForResult(chooser, 1); // The request code is 1 

ActivityBあなたはこれでActivityCを起動しているから。

startActivityForResult(intent, 100); // Request code 100 

そしてActivityCから、あなたのActivityDは、いくつかの結果を設定し、すぐに呼び出すActivityそれに結果の意図を通過するときに100

startActivityForResult(intent, 100); // Same request code 100 

で同じ要求コードとActivityDを起動していますその結果をその親にsuper呼び出しで渡します。あなたのケースでは、それはすぐに結果をActivityBに渡し、ActivityBにハンドラがあり、ヌル値を取得するリクエストコード100も処理されます。

このような状況を避けるには、Activityのそれぞれから別のリクエストコードを設定してみてください。

ActivityBからActivityCを起動してください。

startActivityForResult(intent, 100); // Request code 100 

そしてActivityC打ち上げからActivityD

このような
startActivityForResult(intent, 101); // Request code 101 

今要求コードActivityC101で結果を処理するためにActivityCにハンドラを追加します。

あなたの問題を解決することを望みます。

+0

あなたはActivityBで同じNullレスポンスを得ています – Swapnil

+0

ここで間違っているのは混乱していますが、onActivityResult関数のアノテーションに@Outride'というアノテーションがありますか? –

+0

すべてのアクティビティではい – Swapnil

関連する問題