Android中三个活动之间的传递包

Android中三个活动之间的传递包,android,bundle,android-intent,Android,Bundle,Android Intent,我有三个活动可以调用A、B和C。我想在这三个活动之间传递信息,如下所示:A-->B-->C-->A。在A中,我想检查是否传递了一个捆绑包(例如,第一次启动时,不会有一个)。 数据从A-B通过一个普通包传递。从B-->C中,我使用以下命令: Intent i = new Intent(getApplicationContext(), FlashcardView.class); i.putExtra("rattning", rattning); i

我有三个活动可以调用A、B和C。我想在这三个活动之间传递信息,如下所示:A-->B-->C-->A。在A中,我想检查是否传递了一个捆绑包(例如,第一次启动时,不会有一个)。 数据从A-B通过一个普通包传递。从B-->C中,我使用以下命令:

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);
它被接收,然后发送到如下地址:

  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返回到B,而不是A。我通过调用B上的finish()进行了循环,所以C返回到A。但在这样做的过程中,我失去了优势。至少我这么认为

以前有人见过这个吗?有更好的方法吗?如何防止在两个以上活动之间传递时丢失捆绑包?谢谢

编辑:

编辑:以下是接收广播时的错误代码:

  03-07 12:57:59.394: ERROR/AndroidRuntime(803): java.lang.RuntimeException: Error receiving broadcast Intent { act=my_action (has extras) } in com.crystalcodeab.Flashcard.MenuView$1@47681ad0
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 

当您完成活动B时,为什么要使用新的
Intent
而不是
getIntent()
方法?

我认为问题在于您如何完成活动B。当您完成活动B时,B的结果会发送回a,活动也会消失。C无法知道它应该将结果返回给A,因为它只知道活动B

我给您的建议是,您应该在活动a中使用广播接收器。然后在活动C中,您可以发送一个广播,其中包含您希望a接收的数据:

以一种方式:

在C中:


您可能希望在游戏中使用s而不是活动,并在中管理状态转换,而不是尝试使用活动堆栈。这似乎更容易管理。

我在B中使用getIntent,收集从a发送的参数。然后我启动一个新的Intent并从B向C发送参数。这里我使用参数,收集新的,并希望将它们发送给A。请查看何时在活动c处由B调用。如果您正在完成活动c,则B的onActivityResult将被称为而不是A。因此正确的方法是首先完成活动c,然后在onActivityResult上调用getIntent().getBundle()然后把它传给A,然后说“是”,我理解其中的逻辑。但这是一个游戏,我不希望用户再次通过活动B。也许有一种方法可以做到这一点,而不让它在视觉上显示出来?这听起来不错。但是我仍然在a中得到一个NullPointerException,和以前一样。有没有办法指定广播的目的地?或者在注册接收器之前它是“在空中”的吗?您可以发布logcat中显示NullPointerException的行吗?广播刚刚发送到空中,任何具有匹配intentfilter的人都可以接收。除此之外,您不能指定广播的发送位置。我刚才在开发人员文档中读到,不必指定广播接收器。我可能以错误的方式添加了意图筛选器,或者没有在清单中正确指定接收者。您不需要在清单中指定BroadcastReceiver。在活动中的onCreate或其他方法中添加receiver完全可以。现在它可以工作了!谢谢。如果其他人看到这个问题:我必须像这样检索意图:noqs=intent.getIntExtra(“noqs”,noqs);
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);
Intent data = new Intent("my.action");
data.putExtra("point", point);
data.putExtra("noqs", noqs);
sendBroadcast(data);