Activity生命周期
Activity生命形态
Active/Running:
Activity处于活动状态,此时Activity处于栈顶,是可见状态,可与用户进行交互。
Paused:
当Activity失去焦点时,或被一个新的非全屏的Activity,或被一个透明的Activity放置在栈顶时,Activity
就转化为Paused状态。但我们需要明白,此时Activity只是失去了与用户交互的能力,其所有的状态信息及其成员变量
都还存在只有在系统内存紧张的情况下,才有可能被系统回收掉。
Stopped:
当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时它不再可见
但是跟Paused状态一样保持着其所有状态信息及其成员变量。
Killed:
当Activity被系统回收掉时,Activity就处于Killed状态。
Activity会在以上四种形态中相互切换,至于如何切换,这因用户的操作不同而异。了解了Activity的4种形态后
我们就来聊聊Activity的生命周期。
Activity生命周期
onCreate :
该方法是在Activity被创建时回调,它是生命周期第一个调用的方法
我们在创建Activity时一般都需要重写该方法,然后在该方法中做一些初始化的操作
如通过setContentView设置界面布局的资源,初始化所需要的组件信息等。
onStart :
此方法被回调时表示Activity正在启动,此时Activity已处于可见状态,只是还没有在前台显示,因此无法与用户进行交互。可以简单理解为Activity已显示而我们无法看见摆了。
onResume :
当此方法回调时,则说明Activity已在前台可见,可与用户交互了(处于前面所说的Active/Running形态)
onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互
而onResume则已显示在前台,可与用户交互。当然从流程图,我们也可以看出当Activity停止后
(onPause方法和onStop方法被调用),重新回到前台时也会调用onResume方法
因此我们也可以在onResume方法中初始化一些资源,比如重新初始化在onPause或者onStop方法中释放的资源。
onPause :
此方法被回调时则表示Activity正在停止(Paused形态),一般情况下onStop方法会紧接着被回调
但通过流程图我们还可以看到一种情况是onPause方法执行后直接执行了onResume方法,这属于比较极端的现象了
这可能是用户操作使当前Activity退居后台后又迅速地再回到到当前的Activity,此时onResume方法就会被回调
当然,在onPause方法中我们可以做一些数据存储或者动画停止或者资源回收的操作,但是不能太耗时
因为这可能会影响到新的Activity的显示——onPause方法执行完成后,新Activity的onResume方法才会被执行。
onStop :
一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖(Stopped形态)
此时Activity不可见,仅在后台运行。同样地,在onStop方法可以做一些资源释放的操作(不能太耗时)。
onRestart :
表示Activity正在重新启动,当Activity由不可见变为可见状态时,该方法被回调。这种情况一般是用户
打开了一个新的Activity时,当前的Activity就会被暂停(onPause和onStop被执行了),接着又回到当前
Activity页面时,onRestart方法就会被回调。
onDestroy :
此时Activity正在被销毁,也是生命周期最后一个执行的方法,一般我们可以在此方法中做一些回收工作和最终的资源释放。
代码
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
/**
* 第一个被运行的方法
* 初始化页面
* Bundle恢复上次的状态
*/
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate");
Button button = findViewById(R.id.btn_click_skip);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, TwoActivity.class));
}
});
}
/**
* 从onStop回到Activity的时候会执行
* 按HOME键的时候会执行onStop,重新回到程序会执行这个方法
*/
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart");
}
/**
* 在onCreate,onRestart后面执行
*/
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart");
}
/**
* 在onStart后面执行,执行这个方法后这个Activity就处于全部Activity堆栈的最上面
* 进入用户可见可操作的状态
*/
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume");
}
/**
* 当其他Activity启动时这个方法会执行
* 按HOME和BACK都会执行这个方法
* 最好在这个方法中提交或者保存数据,因为很有可能再也不会回到这个activity中。
* 这个方法最好不要执行太长时间,因为下个activity开始执行前会等待这个方法返回。
*/
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause");
}
/**
* activity很久没被显示,要被销毁,系统资源缺乏,都会调用这个方法
* 按HOME和BACK都会执行这个方法
*/
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop");
}
/**
* 调用finish方法,或者系统回收资源时调用
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy");
}
}
Activity部分生命周期运行图
从打开app到退出app——–Activity所执行的生命周期顺序为 下图:
此时整个生命周期为:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy
—————————————————–分割线—————————————————————————————
如果是跳转另外一个Activity此时MainActivity的生命周期为下图:
此时MainActivity整个生命周期为:onPause -> onStop -> onRestart -> onStart -> onResume
面试题:
从一个ActivityA跳转到另外一个ActivityB后,在返回后,ActivityA的生命
1.Activity-B如果为透明或者窗口化,那么将执行onPause-onResume
2.Activity-B是全屏的,并非透明,那么将执行onPause-onStop-onRestart-onStart-onResume
3.Activity-A因内存不足被回收,那么会执行onPause-onStop-onDestory-onCreate-onStart-onResume
- 如何安全的退出已调用多个Activiy的Application
循环遍历退出用的最多,在Activity打开时记录,并在需要退出时,遍历所有Activity,并
调用finish方法。
2. 其他还有抛异常退出,使用startActivityForResult方法进行连续判断退出,杀进程以及杀
死主线程等方法。
- 横竖屏切换时Activity的生命周期
设置 android:configChanges="orientation" 和不设置这个属性,这两个效果是一样的,activity都是重新创新.
横屏切竖屏,以及竖屏切回横屏,这两个也是一样的(如下总结),不会出现网上说的横屏切回竖屏时
生命周期执行两遍的问题.重新创建activity的生命周期
2.3上:onSaveInstanceState->onPause->onStop->onCreate->onStart->onRestoreInstanceState
->onResume
4.0上:onPause->onSaveInstanceState->onStop->onCreate->onStart->
onRestoreInstanceState->onResume
不重新创建activity,只会调用 onConfigurationChanged
targetSdkVersion会影响生命周期,targetSdkVersion在12及以下的话,
设置了 android:configChanges="orientation|keyboardHidden"
在机器上都不会重新创建activity,只会调用 onConfigurationChanged
如果设置targetSdkVersion>12的话,只在sdkVersion<=12的机器上有效果
>12的机器上activity还是会重新创建(需要加上screenSize才有效果)
android2.3和android4.0的生命周期不一样
2.3是先onSaveInstanceState,后onPause,4.0是先onPause后onSaveInstanceState()
总结:
设置 android:configChanges="orientation" 和不设置这个属性,生命周期表
现为重新创建activity
设置 android:configChanges="orientation|keyboardHidden",在2.3上表现为
不重新创建activity,4.0如下
android:targetSdkVersion<="12",生命周期表现为不重新创建activity
android:targetSdkVersion>"12",表现为重新创建activity
设置 android:configChanges="orientation|keyboardHidden|screenSize",
在2.3和4.0上都表现为不重新创建
与君共勉
我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天