2011-03-07 6 views
4

私はA、B、Cと呼べる3つのアクティビティを持っています。私はA - > B - > C - > Aのように3つの間で情報を渡したいと思います。 Aで、バンドルが渡されているかどうかをチェックしたい(最初の起動時には、たとえば1つもない)。 データは、通常のバンドルでA-Bから渡されます。 - Bから> CIは、これを使用する:それは、受信された後、このように前方へ送られるAndroidの3つのアクティビティ間のバンドル

Intent i = new Intent(getApplicationContext(), FlashcardView.class); 
      i.putExtra("rattning", rattning); 
      i.putExtra("noqs", noqs); 
      i.putExtra("categoryid", categoryid); 
      CreateTestView.this.finish(); 
      startActivityForResult(i, 0); 

それはこのようにAで受信され
Intent data = new Intent(FlashcardView.this, MenuView.class); 
         data.putExtra("point", point); 
         data.putExtra("noqs", noqs); 
         setResult(RESULT_OK, data); 
         finish(); 

@Override 
    protected void onActivityResult(int req, int resp, Intent data) { 
     super.onActivityResult(req, resp, data); 
     // process your received "data" from GameActivity ... 
     Bundle b = getIntent().getExtras(); 
     noqs = b.getInt("noqs"); 
     point = b.getInt("point"); 
     mTvCat.setText("hhhhhh"+point+noqs); 
     publishOnFacebook(point,noqs); 
    } 

C - > Aから途中でバンドルが失われているようですが。私がC - > Bから戻ってきた時、問題はなかった。私はこれが起こると思います。なぜなら、BはCを起動するアクティビティだから、CはAではなくBに落ちます。私はB上でfinish()を呼び出すことで回り道を作ったので、Cは代わりにAに戻ります。これを行うことで、私はバンドルを失う。または少なくとも私はそう考える。

誰もこれまで見たことがありますか?これを行うより良い方法はありますか? 2つ以上のアクティビティ間で渡す際にバンドルを失うのを防ぐにはどうすればよいですか?ありがとう!

編集:

編集:ここでは、放送を受信すると、エラーコードは次のとおりです。

03-07 12:57:59.394: ERROR/AndroidRuntime(803): java.lang.RuntimeException: Error receiving broadcast Intent { act=my_action (has extras) } in [email protected] 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:981) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at android.os.Handler.handleCallback(Handler.java:587) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at android.os.Looper.loop(Looper.java:143) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at android.app.ActivityThread.main(ActivityThread.java:5068) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at dalvik.system.NativeStart.main(Native Method) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803): Caused by: java.lang.NullPointerException 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at com.crystalcodeab.Flashcard.MenuView$1.onReceive(MenuView.java:56) 
03-07 12:57:59.394: ERROR/AndroidRuntime(803):  at 

答えて

5

あなたはアクティビティBの仕方にあると思います。アクティビティBを終了すると、Bの結果はAに返され、アクティビティはなくなります。 CはアクティビティBのみを認識しているので、その結果をAに返すべきであることを知る方法がありません。

アクティビティAでBroadcastReceiverを使用することをお勧めします。で

IntentFilter filter = new IntentFilter("my.action"); 
BroadcastReceiver receiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
    if(intent.getAction().equals("my.action")) { 
     // Do my stuff 
    } 
    } 
} 
registerReceiver(receiver, filter); 

Cで:

Intent data = new Intent("my.action"); 
data.putExtra("point", point); 
data.putExtra("noqs", noqs); 
sendBroadcast(data); 
+0

これは正しいと思います。しかし、私は以前と同じAでNullPointerExceptionを取得します。放送がどこに行くのかを指定する方法はありますか?それとも受信機が登録されるまで「空中」ですか? – kakka47

+0

NullPointerExceptionを示すlogcatの行を投稿できますか?ブロードキャストは、一致するインテントフィルタを受信するすべての人のために放送されます。ブロードキャストがどこから送信されるのかを指定することはできません。 –

+0

私は今、開発者のドキュメントで、ブロードキャスト受信機を指定する必要がないことを読んでいます。インテントフィルタを誤って追加したか、マニフェストの受信者を正しく指定していない可能性があります。 – kakka47

0

あなたは活動Bが終了したら、なぜあなたは代わりにgetIntent()方法の新しいIntentを使用していますか?

+0

私はBでgetIntentを使用し、Aから送信されたパラメータを収集します。次に、新しいIntentを開始し、BからCにパラメータを送信します。ここではパラメータを使用して、新しいものを集めてAに送信します。 – kakka47

+0

あなたがアクティビティCを終了している場合は、Bが呼び出すアクティビティcのurを参照してください。次に、BのonActivityResultはAではなく呼び出されます。適切な方法は、まずアクティビティCを終了し、次にBのonActivityResultを呼び出します。getIntent()。getBundle ()を呼び出してAに渡してからBを終了します。 –

+0

はい、これの論理を理解しています。しかし、それはゲームであり、私はユーザーに再びアクティビティBを渡すことを望んでいません。視覚的に見せないと、これを行う方法があるのでしょうか? – kakka47

0

あなたがFragmentのインを使用したいことがありますによって受信されることを希望するデータを放送しますアクティビティスタックを使用しようとするのではなく、FragmentManager内の状態遷移を管理してください。管理が少し楽になるようです。

関連する問題