最近学习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
然后创建两个活动名为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生命周期理解甚浅,求各位大神前辈轻喷。