保存瞬态DIY +是否已调用或重新创建活动?

时间:2014-12-18 13:25:42

标签: android android-activity restore android-lifecycle

在我的应用程序中,活动A调用活动B(通过显式意图)。生命周期,B可能会被杀死并重新创建等等。

当调用B时(来自A)它会初始化一些东西。但是当重新创建时,它需要从它离开的地方拾取。它会完成()一段时间,然后我回到A,后来可能再次打电话给B ......

B需要保存非常少量的数据,通常只需要几个int值。 (我需要恢复它的其余部分是在getIntent()中,在活动被杀死并重新创建后,它似乎仍然存在。)我听说onSaveInstanceState和onRestoreInstanceState很昂贵而且它们不能保证。另外,我不需要保存视图状态。 (出于这个原因,我应该用空白方法覆盖这两个方法,防止父方法被调用吗?)

存储几个int值的有效方法是什么?我应该将值存储为活动B本身的静态字段,还是应用程序本身的静态字段,还是为此编写的另一个类的静态字段?

此外,活动B如何知道它是否已被重新创建而不是被调用?

1 个答案:

答案 0 :(得分:0)

  

我听说onSaveInstanceState和onRestoreInstanceState价格昂贵且无法保证。

它们并不特别贵。而且,对于您的场景,它们将在大多数时间使用。例外情况是您的任务未重新启动,例如:

  • 用户通过将其从最近任务列表中删除来摆脱您的任务

  • 至少在Android 5.0之前,你的应用程序已经很久没有运行了,并且在最近的任务列表中结束了

  • 用户强制停止您从设置

但在这些情况下你不会在B重启,因为我认为B不是你的发射器活动。

  

出于这个原因,我应该用空白方法覆盖这两个方法,防止父方法被调用吗?

除非您遇到实际问题,否则不仅仅是有关潜在问题的谣言。

  

存储几个int值的有效方法是什么?

对于您的情况,可能使用已保存的实例状态Bundle

如果即使您的任务消失也无法承受丢失这些值(并且您无论如何都不会重新启动),请将它们存储在文件,数据库或SharedPreferences中。

  

我应该将值存储为活动B本身的静态字段,还是应用程序本身的静态字段,还是为此编写的另一个类的静态字段?

不,因为这些都不会奏效。您明确表示您的关注点是"生命周期,B可能会被杀死并重新创建等等。"。该生命周期的一部分是您的流程可能会被终止,在这种情况下,静态数据成员会&" poof"。

  

此外,活动B如何知道它是否已被重新创建而不是被调用?

查看传递到Bundle的已保存实例状态onCreate()是否不是null。或者,如果您正在使用其中一个,请查看是否存在保留的片段。