最近准备好好从基础学学android,所以还是从必不可少的activity学起走吧。
Activity的异常退出
我们知道android正常启动下Activity的生命周期,但是Activity的遇到异常情况就不会按照这正常的生命周期了。
一.当一个activity的config改变的时候,Activity就会被销毁然后重建。
而我们最熟悉的config的改变就是屏幕方向改变,系统语言改变,还有键盘可见改变了。
当然,由于是异常退出,所以正常情况下的onPause
、onstop
、onDestroy
也会被调用。但是,异常的退出,谷歌还是想了办法来解决的。在onstop
的前面,系统会调用onSaveInstanceState
来保存当前Activity
的状态,不过系统只会帮我们保存Activity
的视图,而其它的数据 则不会保存,需要你自己复写 onSaveInstanceState
来保存了。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在这里我们可以把我们需要保存的东西给写入Bundle
//.......
}
接着我们保存了数据就会再新建的Activity中读取出来了,读取保存的数据有两个地方,一个就是我们再熟悉不过的onCreate
方法里了:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
//取出数据 想干嘛就干嘛吧
}
}
另一种就是一个独立的回调了:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
当然,既然回调了这个函数,那么Bundle
就不会为空了,所以也就不需要我们进行检查了。对了,onRestoreInstanceState
是在onstart
后面调用的。对此,我们可以和前面的onSaveInstanceState
在onStop
之前调用联系起来记忆。
从图中我们可以看到我们进行数据保存和恢复的在Activity
生命周期的具体位置,其中我想说的是,或许很多人会问 “数据保存为什么有两个地方”,其实并不然,这里我们只是不能确定onSaveInstanceState
的具体位置。(ps:这里感觉我还有个遗留的知识点:就是在Activity
中启动新的Activity
是在当前Activity
的onPause
之后才启动的,所以谷歌叫我们不要在onPause
中做太多耗时的操作.......貌似扯远了)
当然,我们知道了config
的改变后会影响Activity
的重新产生,那么如果你不想让它重新产生又该怎样办呢?
在AndroidManifest
中,我们的Activity
标签中有一个configChanges
属性,对我们可以通过对它进行设置而让Activity
发生了相应的设置变化而不重新创建。
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation" />
可以用|
来设置多个属性,当我们这样设置后,那如果我们的屏幕方向改变(或者你设置的其它属性改变)Activity
就不会重新创建了,而是回调Activity
中的onConfigurationChanged
函数了:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//回调在这里,我们就可以操作Configuration了
//........
}
二.内存不足的情况下的异常退出
内存不足,貌似这是我们都不想遇到的。但是,遇到了内存不足,android还是会像开始那样对Activity
进行数据保存和恢复,所以也就不多说了。
最后
我并没有写damo
来验证这些结论,但并不代表这些我们不需要。我觉得用damo
去验证是使我们理解并记住所不可缺少的。
还有我是参考《Android开发艺术探索》这本书的,对,就是任大大的。