如果你没有动手去演示的话,你一定要去动手试试看,这个东西非学容易出错,面试中经常出现,好了,上代码:

package com.king.review.base;

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;
import android.widget.LinearLayout; /**
* author: king.liu
* data:2013-10-8 下午8:02:40
* do:TODO
*/ public class ActivityLife extends Activity { public static final String TAG = "ActivityLife"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(140, 80);
layout.setOrientation(LinearLayout.HORIZONTAL);
Button btn = new Button(this);
btn.setLayoutParams(params);
btn.setText("change next");
layout.addView(btn);
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
Intent intent = new Intent();
intent.setClass(ActivityLife.this, AActivity.class);
ActivityLife.this.startActivity(intent);
}
}); setContentView(layout);
Log.i(TAG, "onCreate ...");
} @Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
} @Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart ...");
} @Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart ...");
} @Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume ...");
} @Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause ...");
} @Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop ...");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestory ...");
} }

bActiviy

package com.king.review.base;

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;
import android.widget.LinearLayout;
import android.widget.TextView; /**
* author: king.liu
* data:2013-10-16 上午7:09:22
* do:TODO
*/ public class AActivity extends Activity { public static final String TAG = "AActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(140, 80);
layout.setOrientation(LinearLayout.HORIZONTAL);
TextView tv = new TextView(this);
tv.setLayoutParams(params);
tv.setText("二界面");
layout.addView(tv); setContentView(layout);
Log.i(TAG, "onCreate ...");
} @Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart ...");
} @Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart ...");
} @Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume ...");
} @Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause ...");
} @Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop ...");
} @Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestory ...");
} }

ok,准备工作已经完成,开始分析了:

说明:这里我说的AActivity  --->ActivityLife;   BActivity--->AActivity, 刚开始没有命名好,呵呵。

如上图

刚开始启动的时候,没有疑问,生命周期是这样的,onCreate---> onStart--->onResume;

如上图

好了,点击按钮进入BActivity  ,我们可以看到,AActivity 生命周期进入onPause(注意这个时候没有接着进入onStop,非常容易出错) ,

然后BActivity 的应用程序开始启动:onCreate--->onStart--->onResume.  注意只有当BActivity完全启动了,AActivity生命周期才会进入onStop。

如上图:

这个时候,我按了一下返回键,进入AActivity

可以看到生命周期是 BActivity 生命周期进入onPause,

然后是AActivity生命周期开始调用onRestart,然后再调onStart(这一个估计很多人都会弄错,我也错过了。),再调onResume,  后面就是BActivity 的生命周期进入了onStop与 onDestory. ps: 后面无论如何点,生命周期都是这样的,如此循环。

其中有一点我也解释不了(返回来的时候,为什么是从onRestart 进入onStart,而不是直接从onRestart进入onResume),有大神路过请留言,谢谢.

这里有两点我要说明一下,

首先:返回时,onCreate方法没有调用 而是直接跳过,很多朋友都在心里觉得onCreate与onResume方法是一样的,其实不然,我们在onCreate里面创建一些组件,然后可以复用,刚才就是这个场景,onResume里面就不要做创建组件的操作了,这里面主要是网络数据更新的操作。所以onCreate与onResume还是有区别的,这就是Android程序设计的高明之处。

其次:刚才我们按了返回键后,看到了BActivity被系统回收了,这也是一种高明之处啊,他没有回收AActivity,而是把BActivity给回收了。细细体会一下,就能明白为什么要这样设计。确实有些高明了。呵呵。

续:

如果BActivity的界面是一个窗口,没有完全覆盖AACtivity

如上图,启动还是这样的:onCreate--->onStrat--->onResume,不用多说

如上图,进入BActivity  看看 首先是AActivity被onPause, 然后是BActivity调用的是OnCreate--->onStart--->onResume.  这里注意一下,与之前完全覆盖的生命周期是不一样的。

如上图,再按返回键,你会看到先把BActivity生命周期调到onPause, 然后再是AActivity直接调onResume. 这里注意一下,与之前完全覆盖后的生命周期是不一样的。

如上图

如果再点那个进入BActivity的时候,生命周期是这样的,先是AActivity调onPause,然后再就是BActivity被重新创建了一下,onCreate--->onStart--->onResume,  v好了,下面的需要特别说明一下,把原来的BActivity覆盖了,之前的BActivity调用onStop,onDestory。

这里尤其要注意一下,完全覆盖与非完全覆盖的区别,流程非常容易出错。

梳理一下:

完全覆盖是这样的:

AActivity【onCreate--->onStart--->onResume】,点击进入BActivity【AActivity---》onPause, BActivity,onCreate--->onStart--->onResume, AActivty---->onStop】,然后再按返回键【BActivity--->onPause,AActivity--->onRestart--->onStart--->onResume, BActivtiy--->onStop--->onDestory】

非完全覆盖

AActivity【onCreate--->onStart--->onResume】,点击进入BActivity【AActivity---》onPause, BActivity ---->onCreate---->onStart--->onResume】,然后按返回键【BActivity--->onPause,AActivity--->onResume】如果再进入BActivity【AActivity--》onPause,BActivity--->onCreate--->onStart--->onResume,而之前的BActivity 的周期是----->onStop---->onDestory】

注意对比一下,两种状态的生命周期,

Android 中Activity生命周期分析(二):从AActivity 到BActivity过程分析的更多相关文章

  1. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  2. Android开发——Activity生命周期

    Android开发--Activity生命周期 Activity作为四大组件之首,也是使用最频繁的一种组件.本文将主要讲解Activity生命周期,包括正常情况下的Activity生命周期和异常情况下 ...

  3. 浅谈Android之Activity生命周期

     Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...

  4. Android之Activity生命周期简介

    概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合 ...

  5. android开发------Activity生命周期

    这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...

  6. Android开发--Activity生命周期回顾理解

    Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...

  7. 异常情况下的Activity生命周期分析

    情况1:资源相关的系统配置发生改变 资源相关的系统配置发生改变,举个栗子.当前Activity处于竖屏状态的时候突然转成横屏,系统配置发生了改变,Activity就会销毁并且重建,其onPause, ...

  8. 【Android】Activity 生命周期具体解释

    与其它编程模式不同,android中的Activity没有main()函数.我们无法决定Activity的创建和销毁过程,Activiy的创建和销毁(即生命周期)由系统完毕,系统会在Activity的 ...

  9. 12、Cocos2dx 3.0游戏开发找小三之3.0中的生命周期分析

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706303 生命周期分析 在前面文章中我们执行了第 ...

随机推荐

  1. 简单的C#线程开发实例(隔一秒改变一下Label的Text)

    要实现的效果:点击按纽,窗口上的label上出现1~100数字的变化. 第一个实例(把窗口上的label上文字改成0): using System; using System.Windows.Form ...

  2. VBS基础篇 - FileSystemObject对象

    文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,在Vbs中对桌面和文件系统进行访问的顶级对象是FileSystemObject FSO包含的常见对象有:       ...

  3. 爬虫组NABC

    Need(需求): 我们小组的研究课题是编写一个更实用的爬虫软件,编写时会应用到学长的部分代码并在其基础上完善创新. 鉴于学长代码已经实现了基本功能,即从网站上面爬取相关的Word文档等与计算机有关的 ...

  4. 原生js实现仿window10系统日历效果

    舞动的灵魂版js日历,完全采用js实现,故而实现了与语言无关,jsp.asp.net php asp均可使用.无论你是开发软件,还是网站,均是不可或缺的实用代码. 该日历主要实现了获取当前时间时分秒, ...

  5. c++ std::string 用法

    std::string用法总结 在平常工作中经常用到了string类,本人记忆了不好用到了的时候经常要去查询.在网上摘抄一下总结一下,为以后的查询方便: string类的构造函数: string(co ...

  6. BZOJ 2763: [JLOI2011]飞行路线 spfa dp

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2763 题解: d[x][kk]表示从s到x用了kk次免费机会的最少花费. 代码: #in ...

  7. [转载]eclipse中设置文件的编码格式为utf-8

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:ryxxlong     原文地址:http://ryxxlong.iteye ...

  8. 【转载】OpenStack Swift学习笔记

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:崔炳华      原文地址:http://blog.csdn.net/i_ch ...

  9. BZOJ 4341 [CF253 Printer] 解题报告

    乍一看这个题好像可以二分优先度搞搞... 实际上能不能这么搞呢...? 我反正不会... 于是开始讲我的乱搞算法: 首先肯定要把任务按照优先度排序. 用一棵在线建点的线段树维护一个时刻是否在工作. 然 ...

  10. Json.net/Newtonsoft 3.0 新特性JObject/Linq to Json

    原文:http://www.cnblogs.com/chsword/archive/2008/09/19/Newtonsoft_new_3_0.html http://www.cnblogs.com/ ...