[Android][Activity] onCreate, onSaveInstanceState和onRestore

[Target]

在Activity里的onCreate(Bundle savedInstanceState)函数中,savedInstanceState这个参数是用来存储Activity的信息,包括了每个UI的信息和用户自定义在其中存储的信息。这篇文章就目的就是讨论关于Activity的自身信息的存储。

[Investigation]

Activity下的函数onSaveInstanceState(Bundle outState),是用来做具体内容的存储。如果不复写的话,这个函数的作用就是调用每个View的onSaveInstanceState去存储UI里面的信息,什么文字、颜色、focus的状态等等。如果复写的话,Programmer可以在这里定义一些需要存储的信息,放到Bundle,调用Bundle里面什么putInt之类的函数。

但是这个函数的难点在于它什么时候被调用,这个不是用简单的生命周期来分析定义的,而其中涉及到了一些逻辑判断。

有篇翻译过来的文章值得推荐:

这个函数的执行,我总结下来有这样几点需要注意的

我知道我说的可能跟很多其他人转帖的内容不一样,我只想说这些都是我从实际使用中和阅读了Google文档进行分析的来的,欢迎指正。

说完了onSaveInstanceState的调用情况,来说一下返回情况,一般在onSaveInstanceState存储的值,可以在两个地方得到:

onCreate(Bundle savedInstanceState)onRestoreInstanceState(Bundle savedInstanceState)

onCreate这个函数,我们继承它的时候,经常不会说把super这行代码去掉,因为前面它有很多代码都是包含了如何用savedInstanceState信息来还原界面的。

onRestoreInstanceState这个函数的调用是在onStart到onResume之间执行的。

为什么要有两个来调用?我觉得这跟Activity保存和还原的方式有关。举个例子来说,如果我们调用了startActivity从Activity A跳转到了Activity B,,那么Activity A只调用到了onStop,它本身并没有被消除,只是存到了stack中去了。当你在Activity B中点了Back键,回到Activity A中来,这个时候Activity A是从onStart开始调用的。所以很明显,onCreate这里,我们没有经过,不能在这里读到保存的信息,但是有了onRestoreInstanceState,我们又可以做到了。

[Fect]

说说onSaveInstanceState的缺点,我们可以看到,只有在onCreate和onRestoreInstanceState这样非常不灵活,而且只能用Bundle这个也限制了我们的代码编写。所以Android还提供了一个API:onRetainNonConfigurationInstance。这个下次讨论

[Example]

最后老样子放一个例子:

要做一个积极勇敢乐观的追梦人,永远不说消极的话,

[Android][Activity] onCreate, onSaveInstanceState和onRestore

相关文章:

你感兴趣的文章:

标签云: