我目前正在编写一个能够跟踪分数线的体育应用程序。用户应该选择一项名为" ChooseSport"因为我计划包括特定于不同运动的功能。在他的选择之后,他被引导到一个活动,在那里他应该指定团队名称,最后到活动,他可以通过每次目标发生时提交用户输入来改变分数。根据他在第一项活动中的选择,后续的两项活动都需要不同。但他们仍应有许多相似之处。
因此我决定以下列方式设置所有内容: " ChooseSport"开始打开包含EditTexts的活动的意图,该活动包含依赖于运动的球队名称,例如" FootballActivity"," HandballActivity"," WaterpoloActivity"。 所有这些活动都继承自更通用的类#Sport.Sctivity"。包含得分线的第三个活动被类似地对待:有诸如" FootballScoreActivity"," HandballScoreActivity"和" WaterpoloScoreActivity"这些都继承自更通用的类" ScoreActivity"。如果你选择" football"在" ChooseSport"你应该被引导到" FootballActivity"和" FootballScoreActivity"然后。因此,根据运动的选择,不仅仅是意图来自" ChooseSport"到第二个活动,也是从第二个活动到第三个活动的一个变化。我试图在" SportActivity":
中使用静态变量来实现此行为public class SportActivity extends AppCompatActivity {
public static String titleToolbar;
static ScoreActivity scoreActivityInstance;
...
Intent intent = new Intent(this, streamActivityInstance.getClass());
...
startActivity(intent);
}
public class FootballActivity extends SportActivity {
static {
titleToolbar = "Football";
scoreActivityInstance = new FootballScoreActivity();
}
}
(我在课程上使用.getClass()
代替课程上的.class
,因为我还没有找到一种方法来引用SportActivity中的正确课程,具体取决于" ChooseSport"。)
这开始似乎工作正常但经过一些测试我发现了一个严重的错误:
如果我从ChooseSport开始打开FootballScore,请返回按两次后退按钮,打开手球分数,再次返回,再次打开FootballScore,我最终获得手球分数!
我怀疑会发生以下事情:当启动第一个FootballActivity时,超类SportActivity中的静态变量会被覆盖,因为FootballActivity实际上是初始化的。启动第一个HandballActivity,SportActivity的静态变量再次被覆盖,因为HandballActivity实际上是初始化的。然而,第二次启动FootballActivity并不会覆盖静态超类变量,因为再次启动HandballScore,以便显然超类变量仍处于"手球模式"中。我假设这可能是因为已经存在一个FootballActivity实例,因此android不会再次实例化FootballActivity,导致超类的静态变量不会改变。这个问题对我来说似乎很难,因为android自己实例化了FootballActivity和HandballActivity,而且我没有完全了解android如何做到这一点。
要修复该错误,我尝试在SportActivity中finish()
之后调用startActivity(intent)
。我期望活动被销毁,因为finish()
应该触发对onDestroy()
的调用。然而,这并没有解决这个问题,而且进一步阅读我发现finish()
只会导致onDestroy()
被调用,但不一定在被销毁的活动的实例中(参见勾选的评论{ {3}})。
所以我非常感谢任何提示如何修复我的错误,特别是:
1。)你是否同意我的一般方法有意义?
2。)即使如此,你能想出一种不会导致这种困难的方法吗?
3。)你是否同意我对错误发生的原因?
4.。)我该怎么做才能解决这个问题?
感谢任何善意的建议。
答案 0 :(得分:0)
创建Activity
时,会按特定顺序调用某些事件。请参阅:The Activity Lifecycle
您的static
字段分配了static
初始化程序,该程序在类加载器首次加载类时运行。因此,如果您选择FootballScore
,然后选择HandballScore
,则再次选择FootballScore
,前两次加载类,并完成分配,但第三次,类已经加载,所以没有完成任务。
这种初始化应该在Activity
的生命周期事件中完成,例如,#34;当前活动"应该在onResume()
事件处理程序中分配。
还要记住,这些类可以随时卸载,因此静态字段也会失去它的价值。
有永久存储选项,如配置文件,系统支持等,用于持久数据存储。
public class SportActivity extends AppCompatActivity {
protected String titleToolbar;
@Overriden
public void onCreate(Bundle context) {
...
}
}
public class FootballActivity extends SportActivity {
@Overriden
public void onCreate(Bundle context) {
titleToolbar = "Football";
super.onCreate(context);
...
}
}