Android 中Activity生命周期分析(二):从AActivity 到BActivity过程分析
如果你没有动手去演示的话,你一定要去动手试试看,这个东西非学容易出错,面试中经常出现,好了,上代码:
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过程分析的更多相关文章
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
- Android开发——Activity生命周期
Android开发--Activity生命周期 Activity作为四大组件之首,也是使用最频繁的一种组件.本文将主要讲解Activity生命周期,包括正常情况下的Activity生命周期和异常情况下 ...
- 浅谈Android之Activity生命周期
Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...
- Android之Activity生命周期简介
概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合 ...
- android开发------Activity生命周期
这几天工作比较忙,基本没有什么时间更新播客了. 趁着今晚有点时间,我们来简单说一下什么是Activity生命周期和它们各阶段的特征 什么是生命周期 在还没有接触android开发的时候,听到有人说Ac ...
- Android开发--Activity生命周期回顾理解
Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...
- 异常情况下的Activity生命周期分析
情况1:资源相关的系统配置发生改变 资源相关的系统配置发生改变,举个栗子.当前Activity处于竖屏状态的时候突然转成横屏,系统配置发生了改变,Activity就会销毁并且重建,其onPause, ...
- 【Android】Activity 生命周期具体解释
与其它编程模式不同,android中的Activity没有main()函数.我们无法决定Activity的创建和销毁过程,Activiy的创建和销毁(即生命周期)由系统完毕,系统会在Activity的 ...
- 12、Cocos2dx 3.0游戏开发找小三之3.0中的生命周期分析
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706303 生命周期分析 在前面文章中我们执行了第 ...
随机推荐
- java package and import
1.Package Package类的主要作用是解决命名冲突.package中所存放的所有文件,一般分一下就分这三种 1,java程序源文件,扩展名为.java. 2,编译好的java类文件,扩展名为 ...
- 微软职位内部推荐-Senior SDE for Win Shell Exp
微软近期Open的职位: Job posting title: Senior Software Development Engineer Location: China, Beijing Divisi ...
- MongoDB工具MagicMongoDBTool
MagicMongoDBTool工具是一款MongoDB的数据库管理工具,用来进行简单的数据库管理工作. 此工具为国人开发,项目地址:MagicMongoDBTool,目前作者已经完成基本功能开发. ...
- WPF 多线程处理(3)
WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) 首先我们需要几个属性来保存取得的数据,因为在 ...
- 写一个EF的CodeFirst的Demo
写一个EF的CodeFirst的Demo 今天打算写一个关于EF的CodeFirs的一个小Demo.先略说一个EF的三种与数据库,怎么说,叫映射么,好吧,那就这么叫吧,就是一个是ModelFirst就 ...
- 【UVA】【10828】随机程序
数学期望/高斯消元/马尔可夫过程 刘汝佳老师白书上的例题- -b 本体不满足拓扑关系,但马尔可夫过程是可以高斯消元解的…… 用「高斯·约当消元」更方便! //UVA 10828 #include< ...
- Matlab中find函数的使用
一.问题来源 看到了 min_score_pos = find(A0_scores==min(A0_scores), 1); [r,c] = find(X,k),返回X中第k个非零元素的行列位置. 二 ...
- ios开发之多线程资源争夺
上一篇介绍了常用的多线程技术,目前开发中比较常用的是GCD,其它的熟悉即可.多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用率来提高系统的整体性能,但是会出现多个线程对同一资源 ...
- css ul li 制作导航条
<html> <head> <style> .test ul{list-style:none;} .test li{float:left; width:100px; ...
- [LeetCode]Link List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...