getIntent()。getStringExtra()最终返回null

时间:2016-02-22 07:43:27

标签: android android-intent

因此,在活动A中,我通过意图将一些数据传递给活动B.好的,一切都很好,getStringExtra返回我的期望。然后,从活动B,我将相同的数据传递给活动C.然后,当我点击工具栏中的后退按钮时(因为getSupportActionBar().setDisplayHomeAsUpEnabled(true)),活动B中的getStringExtra现在是{{1} }。

所以流程是A(传递一个字符串) - > B(传递相同的字符串) - > C(工具栏中的后退按钮) - > B现在变量从A传递到B是null。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

将此规则标记为:每当您使用工具栏后退按钮时,您应该注意指定父活动的total = total + 4.23232

在您的情况下,在活动C中按后退按钮后会发生什么,取决于您为活动B指定的launchMode

如果您未指定任何启动模式,则默认启动模式为launchMode。在这种情况下,父活动(B)从堆栈中弹出,并在堆栈顶部创建该活动的新实例以接收意图。

如果已将启动模式指定为standard,则父活动将置于堆栈顶部,并通过其onNewIntent()方法接收意图。也就是说,保留了之前的活动。

参考http://developer.android.com/training/implementing-navigation/ancestral.html#NavigateUp

在您的情况下,您希望保留变量,因此您应该使用singleTop launchMode。

答案 1 :(得分:0)

在您的活动B中,始终在获取字符串之前进行检查 -

if(getIntent().hasExtra(KEY_NAME))
    String s = getIntent().getStringExtra(KEY_NAME);

原因是,当您按下后退按钮时,活动B的启动与您在活动A中创建的意图相同。因此,附加内容不存在。

答案 2 :(得分:0)

你应该将字符串extra作为全局变量字符串,并始终使用hasExtra检查。

答案 3 :(得分:0)

如果要在活动B的onCreate方法中提取数据,那么当您点击活动C中的后退按钮时,不会再次调用活动B的onCreate方法。为了更清楚地了解活动的生命周期,我建议您通过这个developer.android.com/reference/android/app/Activity.html

从活动A启动活动B时出现问题,将您从A发送到B的字符串存储在全局变量而不是本地变量中,并执行类似

的检查
public Class B extends Activity {
private String stringData;   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xml_layout);
        if(getIntent().hasExtra(yourKeyName)) {
            stringData = getIntent().getStringExtra(yourKeyName);
        }
        //Do other stuff
    }

}

答案 4 :(得分:0)

我认为这是不同的过程。

  • 第一个,当您从活动A开始活动B时,您通过 活动A到活动B的数据很明显,所以数据也是如此 将出席。
  • 第二个,然后你从活动B开始活动C,因为 活动B不在前台,那么您的数据将被删除。

您可以通过多种方式将数据保存在活动B上。

  • 其中一个可以实现静态全局变量。
  • 第二种方法,您可以通过保存变量将变量保存在活动B上 数据onSaveInstanceState并从onRestoreInstanceState或中检索 的onCreate
  • 第三种方式,你可以从活动中听取活动B上的活动 C.启动活动C时,必须使用startActivityOnResult 并传递要在活动B上传回的数据。之后 你完成你的活动C,你必须返回最初的数据 来自活动B.

等等......

但实现这一目标的更好方法是第二种方法,使用bundle onSaveInstanceState并在onCreate时检索包数据。