Activity之 生命周期 及 运行例题展示

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.34.0上都表现为不重新创建
与君共勉

我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Life_s/article/details/81252237