前言
前一片文章主要讲了启动模式,但是在本篇文章开始之前要补充一些东西,原理很简单,就是打开新的activity时,AMS会通知ActivityStack去把位于栈顶的activity先onPause。然后开启新的Activity。所以本篇文章会接着讲一些生命周期的相关事宜。
正文
生命周期的几种执行顺序
1、正常启动-关闭:onCreate->onStart->onResume->onPause->onStop->onDesrtoy
2、正常启动-跳转:onCreate->onStart->onResume->onPause->onStop
3、正常启动-跳转-关闭新页面回来:onCreate->onStart->onResume->onPause->onStop->onRestart->onStart->onResume
4、正常启动-异常关闭:onCreate->onStart->onResume->onPause->onStop->onCreate->onStart->onResume
好的,现在我们写几个简单的例子,测试一番,首先附上代码
AActivity
public class AActivity extends Activity {
public final String TAG="A_ACTIVITY";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.life_a);
Log.e(TAG,"onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG,"onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
public void toBActivity(View v){
startActivity(new Intent(this,BActivity.class));
}
BActivity
public class BActivity extends Activity {
public final String TAG="B_ACTIVITY";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG,"onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG,"onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG,"onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG,"onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG,"onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG,"onDestroy");
}
}
然后验证第一种log
启动ativity打开如上图所示,然后关闭
关闭activity
正常启动-关闭:onCreate->onStart->onResume->onPause->onStop->onDesrtoy验证完毕
然后验证第二种
先打开Activity
打开Activity
然后跳转到BActtivity
跳转到BActtivity这里发现,AAcitivy的onStop是在BActivity执行完OnCreate和onStart-onResume后才执行
官方对onPause和onStop说明如下
官方说onPause最好执行一些数据保存,动画停止的操作,而且一定要快,因为下一个页面要等这个方法执行完毕后才会创建。
而stop只说明了当用户完全看不见该页面的时候执行。
所以一些耗时操作千万不要在onPause里执行,一些界面效果不要在onStop里执行。
然后我们回到AActivity
回到AActivity
好的,到此证明了
2、正常启动-跳转:onCreate->onStart->onResume->onPause->onStop
3、正常启动-跳转-关闭新页面回来:onCreate->onStart->onResume->onPause->onStop->onRestart->onStart->onResume
为正确,但是大家也看到了,返回页面操作同打开页面一样,先执行BActivity的onPause,然后执行AActivity的onRestart等等,当onResume执行完毕后,才会执行onStop,onDestroy。
这也就是有时候弄一些APP级别的静态变量,放在onDestroy执行,但是onResume永远拿不到值的原因。
综上所示A跳转B然后返回A的完整生命周期如下
(A)onCreate->(A)onStart->(A)onResume->【跳转】(A)onPause->(B)onCreate->(B)onStart->(B)onResume->(A)onStop【关闭BActivity】(B)onPause->(A)onRestart->(A)onStart->(A)onResume->(B)onStop->(B)onDesrtoy【关闭AActivity】(A)onPause->(A)onStop->(A)onDesrtoy
最后异常处理,常用异常生命周期大致分为四种
1,用户黑屏
2,用户Home
3,系统清理
4,横竖屏切换
1用户黑屏
代码还用上面的代码,只需要按下电源键,然后在回到主界面
电源键
2用户Home
用户Home
然后点击icon回来
image.png
3模拟系统杀死(这里接不截图直接文字说明结果)
1、使用DDMS模拟的话,如果按home先执行home流程然后app终止,如果在当前页,直接不执行onPause瞬间app终止
2、使用系统自带清理系统执行onPause后app终止
3、使用Monitors的Terminate同1
4、使用adb shell am kill 同1
然后打开app时,均执行onCreate->onStart->onResume
4切换屏幕
切换屏幕默认不配置任何东西时,会走两套生命周期先会销毁之前竖屏的activity,然后创建横屏activity
当然,有时候我们并不希望切换屏幕,那就使用screenOrientation属性在AndroidManManidest中设置android:screenOrientation="portrait" 具体属性很多可以点此查看
也有时候需要旋转屏幕,但是不希望重启生命周期,那我们设置
android:configChanges="orientation|screenSize"
其中orientation为屏幕方向转变
screenSize为屏幕尺寸改变
更多属性可以点击这里查看
结语
通过三篇小文章记录了生命周期的三个小点
1、onCreate的两个方法的用法,当activity销毁时什么时候保存我们想要的数据
2、onCreate的执行原理,为什么android系统会执行activity的生命周期
3、生命周期的执行顺序
若有遗漏欢迎大家补充
网友评论