在我的应用程序中,活动A调用活动B(通过显式意图)。生命周期,B可能会被杀死并重新创建等等。
当调用B时(来自A)它会初始化一些东西。但是当重新创建时,它需要从它离开的地方拾取。它会完成()一段时间,然后我回到A,后来可能再次打电话给B ......
B需要保存非常少量的数据,通常只需要几个int值。 (我需要恢复它的其余部分是在getIntent()中,在活动被杀死并重新创建后,它似乎仍然存在。)我听说onSaveInstanceState和onRestoreInstanceState很昂贵而且它们不能保证。另外,我不需要保存视图状态。 (出于这个原因,我应该用空白方法覆盖这两个方法,防止父方法被调用吗?)
存储几个int值的有效方法是什么?我应该将值存储为活动B本身的静态字段,还是应用程序本身的静态字段,还是为此编写的另一个类的静态字段?
此外,活动B如何知道它是否已被重新创建而不是被调用?
答案 0 :(得分:0)
我听说onSaveInstanceState和onRestoreInstanceState价格昂贵且无法保证。
它们并不特别贵。而且,对于您的场景,它们将在大多数时间使用。例外情况是您的任务未重新启动,例如:
用户通过将其从最近任务列表中删除来摆脱您的任务
至少在Android 5.0之前,你的应用程序已经很久没有运行了,并且在最近的任务列表中结束了
用户强制停止您从设置
但在这些情况下你不会在B重启,因为我认为B不是你的发射器活动。
出于这个原因,我应该用空白方法覆盖这两个方法,防止父方法被调用吗?
除非您遇到实际问题,否则不仅仅是有关潜在问题的谣言。
存储几个int值的有效方法是什么?
对于您的情况,可能使用已保存的实例状态Bundle
。
如果即使您的任务消失也无法承受丢失这些值(并且您无论如何都不会重新启动),请将它们存储在文件,数据库或SharedPreferences
中。
我应该将值存储为活动B本身的静态字段,还是应用程序本身的静态字段,还是为此编写的另一个类的静态字段?
不,因为这些都不会奏效。您明确表示您的关注点是"生命周期,B可能会被杀死并重新创建等等。"。该生命周期的一部分是您的流程可能会被终止,在这种情况下,静态数据成员会&" poof"。
此外,活动B如何知道它是否已被重新创建而不是被调用?
查看传递到Bundle
的已保存实例状态onCreate()
是否不是null
。或者,如果您正在使用其中一个,请查看是否存在保留的片段。