在我们日常的Android项目开发中,经常涉及到数据的存储与读取,那么我们一般是将一些轻量级的数据在onPause或onStop时存储起来。那么作为初学者很容易犯的一个错误便是容易混淆存储在这两个位置的区别。
那么有如下的情景,Activity A 中对单例模式下的封装类的某一个属性做了修改(这里拿自定义的Application作为测试封装类):
//自定义Application中有如下代码
private boolean testGate = false;
public boolean getTestGate() {
return testGate;
}
public void setTestGate(boolean testGate) {
this.testGate = testGate;
}
//Activity A中有如下代码
···
drawsomeApp = DrawsomeApplication.getApplicationInstance();
···
@Override
protected void onStop() {
super.onStop();
drawsomeApp.setTestGate(true);
}
这时直接跳转到Activity B中有如下代码:
private Button btShowGate;
@Override
protected void onCreate() {
···
if(drawsomeApp.getTestGate){
//TODO SOMETING
Toast.makeText(this,"show result"+ drawsomeApp.getTestGate(),Toast.LENGTH_LONG);
}
···
btShowGate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showGate();
}
});
···
}
private void showGate(){
Toast.makeText(this,"show result"+ drawsomeApp.getTestGate(),Toast.LENGTH_LONG);
}
那么此时我们进入B界面并不会看到Toast的显示。但通过点击却发现所显示到值为true。那么为什么会出现这样的问题?
典型情况下的生命周期
我们知道典型情况下Activity的生命周期中存在7种方法:
- onCreate()
- onRestart()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestory()
那么请思考如下问题
假设当前Activity为A,如果这是用户打开一个新的Activity B,那么B的onResume()和A的onStop()方法哪个先执行呢? –《Android 开发艺术探索》
这个问题可以从Android 源码中得到解释,在新的Activity启动之前位于栈顶的Activity需要先执行onPause()方法,执行完毕后会依次执行新Activity的onCreate()、onStart()、onResume()方法,最后在执行旧Activity中的onStop()方法。这样也就解释了我们在文章最开始时提出的情景中所遇到的问题,同时也解释了为何不在onPause()中做耗时操作的原因。