背景:
今天做项目时,从网上找了一个日历的控件(和携程的日历类似),我想做成从Activity A中点击一个按钮(time),跳转到日历界面Activity B,选择日历上时间,点击确定后调回到A并且在time上显示选择的时间。这个是一个很容易实现的功能,不过我的Activity A中有两个时间按钮,一个对应开始时间(time_start),一个对应结束时间(time_over)。我点击time_start后跳转到B,选择开始时间后,点击确定按钮带着选择的数据调回A,并在time_start上显示开始时间,紧接着点击结束时间,跳转到B,选择时间后,点击确定按钮带着数据回到A,并在end_start上显示结束时间。这个时候问题出来了,之前选择的time_start上的显示的时间变成了初始值。多次尝试后都是这样的结果,开始寻找原因了。
分析过程:
起初我想到了Activity的生命周期,是不是因为A-->B过程中A被destroy了?然后我在A的三个生命周期方法中添加了输出语句:onCreate(Bundle ...),onResume(),onDestroy()。跑了下程序,结果从A-->B过程中没有过调用onDestroy(),而从B-->A中却调用了onCreate(),onResume()。我脑海中模糊的记忆认为,这个A没被销毁,B调回A后B被销毁,原先的A应该重新被调用,事实不是这样,这就牵扯到Activity的启动模式了。
解决:
A没有被创建,还是原先的A,不过A前面的B直接被销毁了,这就是singleTask的霸道之处。
这个时候问题其实还没解决,我从B传回的参数(time)却为null,我在onResume()中写了Intent intent=getIntent(),String time=intent.getStringExtra("time");,time为Null,为什么了,这就是另外一个知识点了,用singleTask启动模式的Activity会调用一个方法onNewIntent(Intent intent){};通过这个方法你可以得到你传回的参数。
public void onNewIntent(Intent intent){
super.onNewIntent(intent);
setIntent(intent);
InitArg();
}
public void InitArg(){
Bundle bud=getIntent().getExtras();
if(bud!=null){
String type=bud.getString("type");
String time=bud.getString("time");
System.out.println(type+" +++++ "+time);
if("startTime".equals(type)){
start_time.setText(time);
}else if("endTime".equals(type)){
end_time.setText(time);
}
}
}
还是要重点看看启动模式,今天学习了一个新的知识点哟。