2012-03-13 33 views
7

を呼び出すに戻らない)startActivityForResult(で開始しました。活動は、私は3つの活動を持って活動

アクティビティAはアクティビティBを開始し、アクティビティCも開始し、Cの結果を期待しますが、決してそれを取得しません。ここで

は、アプリケーションのワークフローです:

  1. アクティビティAは、アプリの起動時に起動されるとのonCreateで活動Bを(ない結果のために、ちょうどstartActivity())を開始します。

    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        startActivity(new Intent(getApplicationContext(), ActivityB.class)); 
    } 
    
  2. アクティビティAは、次に、後のコードでの活動Cを開始し、startActivityForResult()、および活性Aを使用して結果のためのこの時間はまた、onActivityResult有します。

    Intent intent = new Intent(getApplicationContext(), ActivityC.class); 
    startActivityForResult(intent, 0); 
    

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        ... 
    } 
    
  3. 活動CアクティビティAは、startActivityForResult(と呼ばれるので)、バック活動Aに行くべきいくつかのデータを、返すためにsetResult()および仕上げ()を使用しています。

    Intent intent = new Intent(); 
    intent.putExtra("encryption", encryption); 
    setResult(56, intent); 
    finish(); 
    

しかしワークフローは、ステップ3でサイレント落ちる - 活動AのonActivityResultが活動Aは結果のためにCを開始する1であっても、(Bさんは、そのことについてではありませんどちらも)と呼ばれることはありません。アクティビティBがAとCのコミュニケーションの途中になっているかどうか、または問題が何であるかは不明です。どんな助けでも大歓迎です。

+2

に合格する必要があるかもしれないものはそのように難しい運ぶことIntentです....活動BアクティビティAを使用してWebサービスコールを作成し、アクティビティAがログインが必要であると判断した場合は、アクティビティC –

+0

編集済みの質問を開始して簡単にします。基本的にアクティビティAはアクティビティBを開始し、アクティビティCを開始し、Cからの結果を求めますが、決してそれを取得しません。 – Gady

+0

startActivityforresultforはBアクティビティを開始しますonactivityresultを開始してから復帰するアクティビティ –

答えて

20

私はこれを行うことは決してできませんでした。そのため、データを必要なアクティビティに返す代わりにハンドラを使用しました。

UPDATE:再びこのに実行した後、私はマニフェストに活動Aを受信/通話のためandroid:noHistory="true"を持っていたので、これは働いていなかった本当の理由があることが分かりました。 android:noHistory="true"を削除しても問題ありませんが、それが真である必要がある場合は、ハンドラが適切な回避策です。

+0

ありがとう!私はなぜonActivityResultが呼び出されていないのか理解できず、これが理由でした。 Androidのドキュメントに関する問題(https://code.google.com/p/android/issues/detail?id=68137)を記録しました。 – Vicki

+0

@Vicki 13ヶ月後、この問題にはまだ「New」と記載されています。どうやらAndroidはあまりにも多くの分野を吸う。確かにドキュメンテーションはその一つです。 – sstn

1

getApplicationContext()を使用するべきではありません。

開発者のウェブサイトから。

getApplicationContext() 
Return the context of the single, global Application object of the current process. 

あなたstartActivityForResult()それはあなたがグローバル・アプリケーション・コンテキストとして提供している意図に指定された活動に復帰しようとします。

あなたはActivityBを持っているなら、あなたはそれがActivityCが行われたときActivityBに復帰しようとします

Intent intent = new Intent(ActivityB.this, ActivityC.class); 
startActivityForResult(intent, 0); 

のようにそれを呼び出す必要があります。

+0

結果が返されるアクティビティは、インテントの作成時に指定されたコンテキストではなく、startActivityForResult()と呼ばれます。それにかかわらず、指定したとおりに変更すると、結果はonActivityResultに返されませんでした。 – Gady

+0

最後の2行のコードがActivityBから呼び出された場合の明確化。 ActivityCが開始されてからActivityBに戻りますが、意図を作成するときに使用する正しいパラメータを説明するために、元の質問にもっと答えません。おそらく、アクティビティを開始する場所のコードのより完全な例を追加すると役立つかもしれません。 – triggs

+0

私のシナリオでは、最後の2行のコードがアクティビティAから呼び出されます。アクティビティAは結果を返す場所です。しかし、それは起こっていません、そして私が決定できる唯一の事は、アクティビティAもアクティビティBを最初に開始するからです。 – Gady

-2

あなたはこれを試してみるかもしれません:

if (getParent() == null) { 
setResult(RESULT_OK, dataTobePassback); 
} else { 
getParent().setResult(RESULT_OK, dataTobePassback); 
} 

dataTobePassbackを理解することは、あなたが呼び出し元の活動に

+0

これはなぜ/どのように動作するのかを知ることは興味深いでしょう。 – sstn