Android之Activity生命周期史无前例的详细介绍,新手必必必看

来源:互联网 发布:全世界人民都知道知乎 编辑:程序博客网 时间:2024/04/30 04:54

Android之Activity生命周期史无前例的详细介绍,新手必必必看

                                                           作者:周晓栋,Q,Q:360511404

 

        Android的Activity生命周期是一个非常重要的知识点,但是由于Activity的状态众多,而且状态直接的切换类型也十分的众多,导致Activity的方法很多,这就给新手学习并理解Activity造成了一定的难度,如果你能认真读完我这一篇博文,那么我相信你一定能对Activity的理解达到一个崭新的高度,ok,下面是我对Activity的理解。


        要想透彻的理解Activity,那么必须了解一个计算机的名词,“堆栈”,因为Activity的状态切换方式十分类似于数据结构中的堆栈。

1、首先介绍什么是堆栈,及其特点。

2、介绍Activity的七个状态方法。

3、结合堆栈,详解Activity状态直接的切换和各个方法的调用。

1)、下面我来介绍一下什么是“堆栈”。

       堆栈 可以简单的理解成一个的 “竹筒”,只不过种竹筒是一端封闭另一端开启的,如图所示:

透过这个竹筒我们不难发现,因为堆栈的一端是封闭的,所以要想往里面放东西,必须从一端放,取的时候也只能从一端取,就是这堆栈最重要的特点,“后进先出”。

2)、下面我要介绍的是Activity的七个状态方法。

附官方文档图一张:

然后附我代码一篇:

package cn.blue.life;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class LifteActivity extends Activity {Button bt;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.main);bt=(Button) this.findViewById(R.id.bt);bt.setText("第一个activity");bt.setOnClickListener(new OnClickListener() {public void onClick(View v) {Intent intent=new Intent(LifteActivity.this,LifteActivitySecond.class);startActivity(intent);}});Log.i("Mytag","First----onCreate");}protected void onDestroy() {Log.i("Mytag","First----onDestroy");super.onDestroy();}protected void onPause() {Log.i("Mytag","First----onPause");super.onPause();}protected void onRestart() {Log.i("Mytag","First----onRestart");super.onRestart();}protected void onResume() {Log.i("Mytag","First----onResume");super.onResume();}protected void onStart() {Log.i("Mytag","First----onStart");super.onStart();}protected void onStop() {Log.i("Mytag","First----onStop");super.onStop();}//protected void onRestoreInstanceState(Bundle savedInstanceState) {//Log.i("Mytag","First----onRestoreInstanceState");//super.onRestoreInstanceState(savedInstanceState);//}//protected void onSaveInstanceState(Bundle outState) {//Log.i("Mytag","First----onSaveInstanceState");//super.onSaveInstanceState(outState);//}}

 
onCreate(Bundle savedInstanceState)
onStart()
onResume()
onPause()

onStop()

onDestroy()
onRestart()

 

onCreate(Bundle savedInstanceState)
Activity的初始化,也就是一个全新的Activity开始时,调用该方法
onStart()
Activity的启动,当你能够看到Activity时,启动该方法,
onResume()
当Activity获取用户焦点将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经可以传递给它
onPause()
当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
如果activity重新回到前景时将调用onResume(), 如果对用户彻底不可见则会调用onStop()。
onStop()
当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。
当activity重新回到前景与用户交互时调用onRestart(),如果activity将退出则调用onDestory()。
onDestroy()
在你的activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况
onRestart()
当activity从停止状态重新启动时调用。其后调用onResume()。

3)、结合堆栈,详细介绍Activity的生命周期和状态切换;

下面附上我三个Activity的代码,嘎嘎,

package cn.blue.life;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class LifteActivitySecond extends Activity {Button bt;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.main);bt=(Button) this.findViewById(R.id.bt);bt.setText("第二个activity");bt.setOnClickListener(new OnClickListener() {public void onClick(View v) {Intent intent=new Intent(LifteActivitySecond.this,LifteActivityDialog.class);startActivity(intent);}});Log.i("Mytag","Second---onCreate");}protected void onDestroy() {Log.i("Mytag","Second---onDestroy");super.onDestroy();}protected void onPause() {Log.i("Mytag","Second---onPause");super.onPause();}protected void onRestart() {Log.i("Mytag","Second---onRestart");super.onRestart();}protected void onResume() {Log.i("Mytag","Second---onResume");super.onResume();}protected void onStart() {Log.i("Mytag","Second---onStart");super.onStart();}protected void onStop() {Log.i("Mytag","Second---onStop");super.onStop();}protected void onRestoreInstanceState(Bundle savedInstanceState) {Log.i("Mytag","Second----onRestoreInstanceState");super.onRestoreInstanceState(savedInstanceState);}protected void onSaveInstanceState(Bundle outState) {Log.i("Mytag","Second----onSaveInstanceState");super.onSaveInstanceState(outState);}}

package cn.blue.life;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class LifteActivityDialog extends Activity {Button bt;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.main);bt=(Button) this.findViewById(R.id.bt);bt.setText("一个小对话框");bt.setOnClickListener(new OnClickListener() {public void onClick(View v) {Intent intent=new Intent(LifteActivityDialog.this,LifteActivity.class);startActivity(intent);}});Log.i("Mytag","Dialog---onCreate");}protected void onDestroy() {Log.i("Mytag","Dialog---onDestroy");super.onDestroy();}protected void onPause() {Log.i("Mytag","Dialog---onPause");super.onPause();}protected void onRestart() {Log.i("Mytag","Dialog---onRestart");super.onRestart();}protected void onResume() {Log.i("Mytag","Dialog---onResume");super.onResume();}protected void onStart() {Log.i("Mytag","Dialog---onStart");super.onStart();}protected void onStop() {Log.i("Mytag","Dialog---onStop");super.onStop();}protected void onRestoreInstanceState(Bundle savedInstanceState) {Log.i("Mytag","Dialog----onRestoreInstanceState");super.onRestoreInstanceState(savedInstanceState);}protected void onSaveInstanceState(Bundle outState) {Log.i("Mytag","Dialog----onSaveInstanceState");super.onSaveInstanceState(outState);}}

 

先启动第一个Activity,看一下效果
 

我们到看地第一个Activity的启动,调用了三个方法,分别是,onCreate(),onStart(),onResume(),

他们分别表示初始化Activity,显示Activity,获取用户焦点,可以进行操作。

堆栈图:

现在,我们有三种操作方式,分别是:

一,点击后退键;

二,点击home键;

三,启动第二个Activity;

我给大家一一分析这三种情况:

第一种情况,后退键,将会把最顶层的Activity一从堆栈中移除,的直接销毁

启动到退出,一共执行了6个方法,这就是Activity的生命周期,最简单,最正常的,没有任何打断的生命周期,但是就像人一样,难免会生个病,出个车祸什么的,所以,下面介绍第二种和第三种;

上图是我点击了home键之后的执行结果,我们看到又执行了两个方法,分别是onPause和onStop,但是并没有onDestroy,说明Activity并没有被杀掉;而是留在了堆栈之中,处于一种不可见的状态,如果这时候我们又启动这个Activity,会发生什么情况,接下来看图

现在我们看到它又执行了三个方法,分别是onRestart,onStart,onResume,

分别是回到启动,启动,重新获取用户的焦点,从这里我们不难看出,后退键杀死了处于堆栈最上方的Activity,而home键并没有杀死Activity,而是将其处于一种不可见的状态,可以随时恢复;

下面介绍第三种情况,比较复杂;

当我们点击按钮启动第二个Activity时,会发生什么情况,看图:

 

这次一共调用了5个方法,我来一一说明:

首先是onPause,它将第一个Activity暂停,然后创建第二个Activity,启动它,获取用户焦点,这个时候第一个Activity将处于不可见状态,所以调用其onStop方法,堆栈:

接下来分为两种情况;一种是点击后退键,一种是点击home键

先看点击后退键的情况:

后退,也就是启动上一个Activity,这时先将当前的Activity暂停,onPause,然后启动上一个Activity,启动直到获取用户焦点,就把第二个Activity销毁;

如果点击home键,参考前面的情况;

下面介绍什么时候调用Activity可见,但是失去用户焦点后,再次获取用户焦点的情况,也就是调用onPause,再调用onResume

这种情况是第三个Activity启动,但是样式是对话框,并没有将第二个Activity完全遮挡,所以第二个Activity只调用了onPause,这时候后退

时间关系,未完待续.......

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美图t8开机慢怎么办 美图m6s拍照模糊怎么办 8848m4密码忘了怎么办 美图手机m4自拍黑屏怎么办 美图m4相机黑屏怎么办 美图m4手机拍照黑屏怎么办 美图m4拍照黑屏怎么办 美图m4很卡怎么办 美图m8工厂模式怎么办 美图m6开不了机怎么办 美图m8开不开机怎么办 美图摄像头坏了怎么办 美图t8相机模糊怎么办 美图m4卡槽坏了怎么办 美图t8手机好卡怎么办 美图手机m6卡怎么办 美图t8屏幕不亮怎么办 美图m8卡机了怎么办 美图m6手机太卡怎么办 美图t8闪退怎么办 美图手机相机闪退怎么办 美图手机闪屏怎么办 魅族m6相册闪退怎么办 美图m6工厂模式怎么办 美图m6手机死机怎么办 美图m6s开不了机怎么办 美图手机m6进水怎么办 美图t8摔黑屏怎么办 美图屏幕点不动怎么办 朗动钥匙丢了怎么办 深圳小汽车摇号中签了怎么办 深圳摇号审核通过后怎么办 京东过保修期了怎么办 买的商业预付卡怎么办 壹钱包预付卡金额不足怎么办 美发店换老板原来预付卡怎么办 超市预付卡现超市停业怎么办? 利群购物卡丢了怎么办 利群金卡丢了怎么办 坐飞机洗漱用品超过规定怎么办 请律师团了解后怎么办