Android 应用小部件 SeekBar 进度在 onDestroy() 中存活

Android app widget SeekBar progress survives onDestroy()

我最近开始学习 Android 编程,这是在完全停止编程之后(五年)。到目前为止一切顺利。

我注意到 Seek Bar 的进度在旋转(配置更改)发生后在 onDestroy 事件中幸存下来,这发生在碎片 activity 上。然后我创建了一个空的 activity 并在布局中添加了小部件,结果是相同的(如我所料,但由于某些代码仍然尝试)。我还尝试覆盖 onCreate 方法并将空 SavedBundleInstance 传递给 super.onCreate(),结果是相同的。所以我不知道 Seek Bar 的进度位置在 onDestroy 之前保存在哪里然后传回,除非我在 SeekBar class 或其超级 classes 中缺少一些静态变量。 (我现在才想到,我应该检查一下)

有人可以解释为什么会这样吗?

通常,Android Views 在旋转时保存它们的状态。例如 EditText 也会发生同样的情况。如果您输入内容然后旋转设备,文本将被保留。
它是在特定的 View class.

中完成的

但是这种状态是如何通过方向变化持续存在的呢? 例如,在活动中,您有 onSaveInstanceState(Bundle bundle)。在发生配置更改之前,系统会调用该方法。要保持 Activity 的状态,您所做的就是在 bundle 中存储您要保存的值。然后,当再次创建 Activity 时,这个 bundle 会传回给您,例如在 onCreate 方法中。这样你就可以恢复你的状态了。

但是 View 呢?他们使用类似的机制。如果我们想要详细信息,我们必须查看源代码。让我们看看 source code of ProgressBar. It turns out that the View has a onSaveInstanceState, too (this line)。你可以在那里看到,正在保存进度。

我希望这能阐明机制。