关于Activity生命周期的知识点分享

关于Activity生命周期的知识点分享

Activity作为四大组件之一,可视化的活动。其简单基本Activity的生命周期为(牢记这张图)关于Activity生命周期的知识点分享
但是在实际app中我们会遇到很多关于此的生命周期变化的考虑,如:

首先假设我们设立起始的 Activity A ,在第一次创建时会依次执行我们熟知的生命周期onCreate() ,onStart() 和onResume() 方法

1.当我们从Activity A ,跳转到Activity B的时候

  1. Activity B 设置的属性为 完全遮挡 ,首先Activity A 的onPause() 和onStop() 方法会得到执行

    A/onPause()->B/Create(Bundle bundle) ->B onStart()-> B onResume() -> A/Stop()

  2. Activity B 设置的属性为 不完全遮挡 ,只有Activity A 的onPause() 方法会得到执行
    A/onPause()->B/Create(Bundle bundle) ->B onStart()-> B onResume()

2.当我们从Activity B ,点击 "BACK"键回到Activity A 的时候:

  1. Activity B 设置的属性为 完全遮挡 ,之前Activity A 已经进入到了停止状态,所以onRestart方法会得到执行,之后又会依次执行onStart() 和onResume() 方法,此时的onCreate(方法不会执行,因为Activity A并没有被重建。

    B/onPause()->A/onRestart() -> A/onStart() - >A/onResume()->B/onStop()->B/onDestroy()

  2. Activity B 设置的属性为 不完全遮挡 ,由于之前Activity A 的onStop() 方法并没有得到执行,由于没有完全遮盖,A只是进入了暂停状态,在点击 “back键” 之后只会有onResume() 方法会得到执行。
    B/onPause() - >A/onResume()->B/onStop()->B/onDestroy()

3.当Activity A 在 停止状态 被系统回收掉的时候:

A 跳转到完全遮挡B 的时候,A 会调用onStop()的方法,(参考1.1)这个时候可能会因为系统内存不足的原因被回收掉,然后用户按下"back"返回的时候,不会执行onRestart() 方法,而是会执行onCreate()方法,这种情况被回收需要重新创建一次.
.
.
<<解决方法>>
很熟悉的方法,Activity中提供了onSaveInstanceState() 回调方法,这个方法的用途是保证活动在回收之前一定会被调用,解决活动在回收的时候数据得不到保存的问题。

  • onSaveInstanceState() 方法中携带的Bundle 类型的参数,如 ”putInt()"等,每个保存方法传入两个参数,第一个是键,用与后面从Bundle中取值,第二个参数是真正要保存的内容代码了解一下
// An highlighted block
outState.putString("date_key",tempData);
  • 保存方法了解过了,在哪里恢复呢??在onCreate方法中也有Bundle类型的参数,而且一般都是 null,在活动被回收之前的时候通过onSaveInstanceState() 法用来保存了数据,这个参数就会保存之前的数据,此时想要恢复的话只需要相应的取值方法将之取出就可以了。嘿嘿嘿代码也了解一下
if (saveInstanceState !=null){
    String tempData=saveInstanceState.getString("data_key");
    log.d(TAG, tempData);

4.对于已经打开的Ativity按下 Home键:

已经打开的Activity按下HOME键,其实也没反应。当作A被全覆盖了,进入onStop()停止状态.
A/onPause() -> A/Stop()

5.从打开的其它app中,back到正在运行的Activity:

这些情况都可以当做是全覆盖的B返回A的状态,由于已经步入了onStop()停止状态 back 回去需要执行onRestart()
A/onRestart() -> A/onStart() - >A/onResume()

6.打开Activity,然后按下power键锁屏:

同按下HOME键同理
A/onPause() -> A/Stop()

7.Activity正在前台时,锁屏的屏幕点亮

同5,参考1、2
A/onRestart() -> A/onStart() - >A/onResume()

8.已经打开第一个Activity A,再打开Activity B,再按下home键

一步一步来,首先在打开Activity B 的时候,已经A已经走过了从 A/onPause() -> A/Stop()的过程,此时A的生命周期就没有必要考虑,所以如 " 6 " 是一样的过程
B/onPause() -> B/Stop()

9.已经打开第一个Activity A,再打开非全覆盖Activity C,再按下home键

关于Activity生命周期的知识点分享
这里原理是一样的,首先按下HOME键,最先变化的是Activity C,步入 onPause() 阶段。由于Activity C为非全覆盖,在之前的Activity A由于是 onPause() 阶段,并没有结束,所以之后走的是A的 onStop() ,在之后类比之前的单个activity按下HOME键,到了C的 onStop()阶段
.
.
.
.
.

Ennnnnnn…再然后,再然后没然后了你们自己琢磨,蛮多的~~