因此,在活动A中,我通过意图将一些数据传递给活动B.好的,一切都很好,getStringExtra
返回我的期望。然后,从活动B,我将相同的数据传递给活动C.然后,当我点击工具栏中的后退按钮时(因为getSupportActionBar().setDisplayHomeAsUpEnabled(true)
),活动B中的getStringExtra
现在是{{1} }。
所以流程是A(传递一个字符串) - > B(传递相同的字符串) - > C(工具栏中的后退按钮) - > B现在变量从A传递到B是null
。我该如何解决这个问题?
答案 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)
我认为这是不同的过程。
您可以通过多种方式将数据保存在活动B上。
等等......
但实现这一目标的更好方法是第二种方法,使用bundle onSaveInstanceState并在onCreate时检索包数据。