在活动继承的上下文中使用静态变量的问题

时间:2017-08-24 08:01:34

标签: java android inheritance

我目前正在编写一个能够跟踪分数线的体育应用程序。用户应该选择一项名为" 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.。)我该怎么做才能解决这个问题?

感谢任何善意的建议。

1 个答案:

答案 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);
      ...
   }
}