关于Activity的生命周期理解

最近学习android中关于Activity的生命周期方面,对于有些方面有所理解,希望写下来记录,方便以后查看,顺便也克服一下自己的不会解释的缺点。
关于Activity的生命周期的理解,将分为以下几步:
栈的工作原理
Activity的运行状态
Activity的生命周期详细流程以及七大方法
Activity生命周期的示范实例

第一.栈的工作原理

首先,从开发者的角度看,一个应用是由多个Activity--也就是活动组成的,在官方解释下,任务(Task)就是许多存放在中的Activity的集合,大概理解就是 每当用户打开一个应用的时候,就像是创建了一个任务。而任务需要容器装着,这个容器就叫做,也被称为返回栈。返回栈遵循着先进后出的原则,意思是比如我们打开一个应用,第一个界面就是这个应用的主活动,这个主活动将进栈并处在这个栈的栈顶,表示这个活动是可见的并且能够与用户进行交互;然后我们点击某个按钮,切换到另外一个活动时,这个活动将会取代第一个活动并处在栈顶的位置,最后当我们点击返回键时,这时第二个活动将会出栈并销毁,第一个活动将会重新回到栈顶。
这个理解跟进栈,出栈方面有很大关系,不理解的请自行查阅啦。

第二.Activity的运行状态

接着另外一个关于Activity的知识,需要讲讲,那就是Activity的状态。
Activity的状态有四种:
第一种:运行状态,在Activity的运行状态下,这个活动是可见的并且可以与用户进行交互的,怎么理解呢,就是应用打开后我们所面对的第一个界面,这个界面就是指运行状态下的Activity,那么这个活动我们是看得见的(可见的)并且我们可以进行操作(与用户进行操作)。

第二种:暂停状态,暂停状态下的活动依旧是可见的但是,并不能与用户进行交互。咦,这种状态下的活动存在吗?好像没有遇到过 -- 有的,在应用下,当我们切换到第二个活动下有时会遇到一些对话框式的活动,除了这个对话框之外,阴影部分是不是第一个活动?那么这个第一个活动我们是可见的,但是我们并不能对其进行任何的操作,这种活动就是在暂停状态下的。

第三种:停止状态,停止状态下的Activity,就是不可见并且无法进行交互的。在从第一个活动中切换到第二个活动时,第一个活动我们看不见并且也无法进行任何的操作,这种状态就是停止状态。
无论如何,这三种状态,无论是暂停状态,还是停止状态,都是在栈中的,没有出过栈。

第四种:销毁状态,这种状态下的Activity将会被出栈,销毁,将不存在在任务流程下,就是当我们处在第二个活动下,想要返回第一个活动时,我们就点击返回键(Back),这时,第二个活动将会从栈中退出并销毁,这种状态就是销毁状态。

第三.Activity的生命周期详细流程以及七大方法

在理解了Activity工作原理,Activity的状态以后,就是Activity的生命周期部分
你有没有注意到一个细节,就是关于关于Activity的工作原理,Activity的状态,主要注重在两点:可见性与可交互性,在Activity的生命周期中,也是围绕这两点。
先贴张图:

这张图就是Activity的生命周期,所涉及到的有七个Android关于Activity的方法。
网上有很多前辈大神的解释都是一个个方法解释的,我就换另外一种方式吧,我从用户的角度将整个应用的开始到结束解释一遍吧。
首先为了全面覆盖所有要用到的方法,我从两个应用来讲。

1.第一种应用(切换界面)

(1)当我们点击从手机的应用时,将会调用onCreate()onStart()onResume()这三个方法,那么这三个怎么去理解呢?
当我们点击应用时,调用onCreate()时,表示正在第一次创建这个活动;调用onStart()方法时,表示现在这个活动为可见的;调用onResume()方法时,表示该活动准备好与用户进行交互,也就是用户可进行操作。这时,这个应用正处于运行状态。
也就是说,
创建活动→可见性→可交互性→启动主活动
就是,可见+可交互=运行状态

(2)那么我们准备点击该界面上的一个按钮进行切换到另外一个活动,这时,将会调用onPause()onStop()方法。当调用onPause()方法时,表示该活动准备调用或启动另外一个活动,也意味着该活动不可交互;当调用onStop()方法时,表示该活动已经变为不可见了。
我们只是探究主活动的方法调用,所以第二个活动的启动不会说,但是是与启动活动是相同的。
由此可见,主活动不交互性→主活动不可见性→启动第二个活动
就是,不可见+不可交互=停止状态

(3)那当我们想要返回到主活动时,点击返回键,将会调用主活动的onRestart()→onStart()→onResume()方法,那么这里其实跟刚开始启动主活动是一样的,但是这其中不一样的就是一开始的方法调用,onCreate()是指方法第一次被创建才会执行,onRestart()是指重新调用已经被创造的活动,那么意思就是说该活动还是处于返回栈中,如果该活动还在栈中,就调用onRestart()。
那么这里一样,重新调用→可见性→可交互性→返回主活动
那么,思考下,有没有可能本来就创建过该活动,但是当我们切换到另外一个活动的时候,它却偷偷跑了呢?
有的,当我们手机系统发现内存不够的话,系统将会回收那些处于停止状态下的活动,那么这个时候就会出现这种情况,创造该活动之后却被系统清除了。
那么出现这种情况的话,当我们处于第二个活动而主活动却被系统清除了,这时将会重新启动该活动,也就是调用方法onCreate()→onStart()→onResume()方法。

(4)现在我们处于主活动,当我们想要回到手机的首页,我们就要再次点击返回键,这时将调用onPasue()→onStop()→onDestroy()方法,调用onDestroy()也就意味着该活动将退出栈顶并且被销毁
也就是说,不可交互性+不可见性+摧毁=销毁状态
所以切换到第二个活动会在 **运行状态 到 停止状态 **直接转换。
在销毁活动的时候,该活动就是处在销毁状态。

2.第二种应用(切换到对话框式的活动)
关于该应用的启动与销毁 我就不讲了,都是一样的原理。切换到对话框式的活动主要不一样在切换部分。
(1)当我们准备点击按钮而弹出一个对话框式的活动,这只会调用onPause()方法,这个跟之前切换第二个活动有什么区别呢?我们之前切换第二个活动时所调用的是onPause()→onStop()方法。咦,那为什么不用调用onStop()方法呢?onPause()方法指的是该活动将不能与用户进行交互,而Stop()方法指该活动不可见
想想,当应用弹出对话框式的活动时,所看见的除对话框式活动之外,就是阴影部分下的主活动,这个主活动对于用户来说是可见的但是无法对其进行操作,所以,该主活动是处在暂停状态下的,只会调用onPause().
(2)那么当我们想从对话框式的活动回到主活动,我们将点击返回键,这是将会调用onResume()方法,表示该活动准备好与用户进行交互。
所以切换对话框式的活动会在 运行状态 到 暂停状态之间转换。

可以发现,整个Activity的生命周期都是围绕 Activity的先进后出的返回栈的工作原理,Activity的四大状态跟活动的可见性与可交互性
我先列出七大Activity的方法:
onCreate():在活动的第一次被创建的时候被调用
onStart():表示该活动为可见
onResume():表示该活动已经准备好与用户进行交互
onPause():表示该活动正在调用或启动另外一个应用,意味该活动不可与用户进行交互
onStop():表示该活动从可见转为不可见
onDestroy():表示该活动将被销毁
onRestart():表示该活动将被重新调用或启动

第四.Activity生命周期的示范实例

关于代码的实例的话我是模仿郭霖老师写的《第一行代码》中的。
我构建了三个活动:第一个主活动为MainActivity.lava

public classMainActivityextendsAppCompatActivity {
  public static finalStringTAG="MainActivity";
@Override
  protected voidonCreate(Bundle savedInstanceState) {//重写onCreate()方法,传入之前推出所保存的Activity的数据状态
super.onCreate(savedInstanceState);//调用父类方法onCreate(),传入savedInstanceState
setContentView(R.layout.activity_main);//调用setContentView()方法构建视图
}
Log.d(TAG,"onCreate");//通过Log打印应用信息,级别为debug
Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);//获取Button的实例,将View对象转换为Button对象
Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);//获取Button的实例,将View对象转换为Button对象
startNormalActivity.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
Intent intent =newIntent(MainActivity.this,NormalActivity.class);//构建一个Intent对象,第一个值为 上下文,第二个值为目标活动
startActivity(intent);//调用startActivity()方法,执行该Intent
}
});//为该控件注册一个监听器
startDialogActivity.setOnClickListener(newView.OnClickListener() {
@Override
public voidonClick(View view) {
Intent intent =newIntent(MainActivity.this,DialogActivity.class);//构建一个Intent对象,第一个值为context上下文,第二个值为目标活动
startActivity(intent);//将Intent传入,执行该Intent
}
});//为该控件注册一个监听器
}
@Override
protected voidonStart() {//调用onStart()方法,表示该活动由不可见到可见
super.onStart();
Log.d(TAG,"onStart");//调用Log打印信息,级别为debug
}
@Override
protected voidonResume() {//调用onResume()方法,表示该活动准备好与用户进行交互
super.onResume();
Log.d(TAG,"onResume");//调用Log打印信息,级别为debug
}
@Override
protected voidonPause() {//调用onPause()方法,表示该活动准备调用另外一个活动
super.onPause();
Log.d(TAG,"onPause");//调用Log打印信息,级别为debug
}
@Override
protected voidonStop() {//调用onStop()方法,表示该活动由可见转为不可见
super.onStop();
Log.d(TAG,"onStop");//调用Log打印信息,级别为debug
}
@Override
protected voidonRestart() {//调用onRestart()方法,表示该活动由停止状态转向运行状态
super.onRestart();
Log.d(TAG,"onRestart");//调用Log打印信息,级别为debug
}
@Override
protected voidonDestroy() {//调用onDestory()方法,表示该活动将被销毁
super.onDestroy();
Log.d(TAG,"onDestory");//调用Log打印信息,级别为debug
}
@Override
protected voidonSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String data ="Something you just typed";//定义字符串data并赋值
outState.putString("data_key",data);//将值传入,第一个为键,用于在目标活动找回数据,第二个值为需要保存的值
}

关于布局文件为activity_main.xml

<xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.activitylifecycletest.MainActivity">
<android:id="@+id/start_normal_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start NormalActivity"/>

<android:id="@+id/start_dialog_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start DialogActivity"
android:layout_below="@+id/start_normal_activity"
android:layout_alignParentStart="true"
android:layout_marginTop="10dp"/>


然后创建两个活动名为NormalActivity(普通活动) 与 DialogActivity(对话框式的活动)
并以此自动构建两个对应的布局文件
当我们点击应用图标时,我们将创建主活动,通过Log打印语句来了解整个activity的生命周期
这时在android Monitor下Log.d将打印出如下:

05-27 23:42:34.932 2254-2254/com.example.activitylifecycletest D/MainActivity: onCreate
05-27 23:42:34.934 2254-2254/com.example.activitylifecycletest D/MainActivity: onStart
05-27 23:42:34.936 2254-2254/com.example.activitylifecycletest D/MainActivity: onResume

以下为界面:

将会出现两个按钮,一个是用来切换NormalActivity的普通活动,另外一个是用来切换DialogActivity的对话框式的活动。
(1)点击 start NormalActivity的按钮,将会切换到NormalActivity的界面,这是Android Monitor将会打印出:

05-27 23:51:10.012 2254-2254/com.example.activitylifecycletest D/MainActivity: onPause
05-27 23:51:10.739 2254-2254/com.example.activitylifecycletest D/MainActivity: onStop

当点击返回键时,将会回到主页面MainActivity,将会打印出:

05-27 23:52:25.919 2254-2254/com.example.activitylifecycletest D/MainActivity: onRestart
05-27 23:52:25.919 2254-2254/com.example.activitylifecycletest D/MainActivity: onStart
05-27 23:52:25.920 2254-2254/com.example.activitylifecycletest D/MainActivity: onResume

(2)这时候我们点击Start DialogActivity按钮,这是Android Monitor将会打印:

05-27 23:53:54.872 2254-2254/com.example.activitylifecycletest D/MainActivity: onPause

点击返回键,返回主页面MainActivity,将会打印出:

05-27 23:55:19.005 2254-2254/com.example.activitylifecycletest D/MainActivity: onResume

(3)那么当我们想退出该应用,我们将点击返回键,返回手机的主页面,这时候Android Monitor将会打印出:

05-27 23:57:23.672 2254-2254/com.example.activitylifecycletest D/MainActivity: onPause
05-27 23:57:24.336 2254-2254/com.example.activitylifecycletest D/MainActivity: onStop
05-27 23:57:24.336 2254-2254/com.example.activitylifecycletest D/MainActivity: onDestory

这就是整个Activity的生命周期,这个代码实例将涵盖这七个Activity的方法

大概我的理解就这么多,因为是小白刚学没多久,所以我对于Activity生命周期理解甚浅,求各位大神前辈轻喷。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容